mirror of https://github.com/PentHertz/srsLTE.git
Merge branch 'next' of github.com:softwareradiosystems/srsLTE into next
This commit is contained in:
commit
808e3a532b
|
@ -528,9 +528,9 @@ int update_radl() {
|
||||||
|
|
||||||
srslte_ra_pdsch_fprint(stdout, &ra_dl, cell.nof_prb);
|
srslte_ra_pdsch_fprint(stdout, &ra_dl, cell.nof_prb);
|
||||||
srslte_ra_dl_grant_t dummy_grant;
|
srslte_ra_dl_grant_t dummy_grant;
|
||||||
srslte_ra_nbits_t dummy_nbits;
|
srslte_ra_nbits_t dummy_nbits[SRSLTE_MAX_CODEWORDS];
|
||||||
srslte_ra_dl_dci_to_grant(&ra_dl, cell.nof_prb, UE_CRNTI, &dummy_grant);
|
srslte_ra_dl_dci_to_grant(&ra_dl, cell.nof_prb, UE_CRNTI, &dummy_grant);
|
||||||
srslte_ra_dl_grant_to_nbits(&dummy_grant, cfi, cell, 0, &dummy_nbits);
|
srslte_ra_dl_grant_to_nbits(&dummy_grant, cfi, cell, 0, dummy_nbits);
|
||||||
srslte_ra_dl_grant_fprint(stdout, &dummy_grant);
|
srslte_ra_dl_grant_fprint(stdout, &dummy_grant);
|
||||||
dummy_grant.sf_type = SRSLTE_SF_NORM;
|
dummy_grant.sf_type = SRSLTE_SF_NORM;
|
||||||
if (pdsch_cfg.mimo_type != SRSLTE_MIMO_TYPE_SINGLE_ANTENNA) {
|
if (pdsch_cfg.mimo_type != SRSLTE_MIMO_TYPE_SINGLE_ANTENNA) {
|
||||||
|
|
|
@ -803,6 +803,7 @@ int main(int argc, char **argv) {
|
||||||
PRINT_LINE(" nof layers: %d", ue_dl.pdsch_cfg.nof_layers);
|
PRINT_LINE(" nof layers: %d", ue_dl.pdsch_cfg.nof_layers);
|
||||||
PRINT_LINE("nof codewords: %d", SRSLTE_RA_DL_GRANT_NOF_TB(&ue_dl.pdsch_cfg.grant));
|
PRINT_LINE("nof codewords: %d", SRSLTE_RA_DL_GRANT_NOF_TB(&ue_dl.pdsch_cfg.grant));
|
||||||
PRINT_LINE(" CFO: %+7.2f Hz", srslte_ue_sync_get_cfo(&ue_sync));
|
PRINT_LINE(" CFO: %+7.2f Hz", srslte_ue_sync_get_cfo(&ue_sync));
|
||||||
|
PRINT_LINE(" RSRP: %+5.1f dBm | %+5.1f dBm", 10 * log10(rsrp0), 10 * log10(rsrp1));
|
||||||
PRINT_LINE(" SNR: %+5.1f dB | %+5.1f dB", 10 * log10(rsrp0 / noise), 10 * log10(rsrp1 / noise));
|
PRINT_LINE(" SNR: %+5.1f dB | %+5.1f dB", 10 * log10(rsrp0 / noise), 10 * log10(rsrp1 / noise));
|
||||||
PRINT_LINE(" Rb: %6.2f / %6.2f / %6.2f Mbps (net/maximum/processing)", uerate, enodebrate, procrate);
|
PRINT_LINE(" Rb: %6.2f / %6.2f / %6.2f Mbps (net/maximum/processing)", uerate, enodebrate, procrate);
|
||||||
PRINT_LINE(" PDCCH-Miss: %5.2f%%", 100 * (1 - (float) ue_dl.nof_detected / nof_trials));
|
PRINT_LINE(" PDCCH-Miss: %5.2f%%", 100 * (1 - (float) ue_dl.nof_detected / nof_trials));
|
||||||
|
|
|
@ -133,7 +133,7 @@ void map_simd_dec(map_gen_t * h, int16_t * input[SRSLTE_TDEC_MAX_NPAR], int16_t
|
||||||
{
|
{
|
||||||
|
|
||||||
uint32_t nof_cb = 1;
|
uint32_t nof_cb = 1;
|
||||||
int16_t *outptr[SRSLTE_TDEC_MAX_NPAR];
|
int16_t *outptr[SRSLTE_TDEC_MAX_NPAR] = { NULL, NULL };
|
||||||
|
|
||||||
// Compute branch metrics
|
// Compute branch metrics
|
||||||
switch(cb_mask) {
|
switch(cb_mask) {
|
||||||
|
|
|
@ -85,6 +85,10 @@ void map_sse_inter_beta(srslte_tdec_simd_inter_t * s, int16_t *input, int16_t *p
|
||||||
__m128i *outputPtr = (__m128i*) output;
|
__m128i *outputPtr = (__m128i*) output;
|
||||||
__m128i *alphaPtr = (__m128i*) s->alpha;
|
__m128i *alphaPtr = (__m128i*) s->alpha;
|
||||||
|
|
||||||
|
for (int i = 0; i < 8; i++) {
|
||||||
|
old[i] = _mm_set1_epi16(0);
|
||||||
|
}
|
||||||
|
|
||||||
for (int k = end - 1; k >= 0; k--) {
|
for (int k = end - 1; k >= 0; k--) {
|
||||||
x = _mm_load_si128(inputPtr++);
|
x = _mm_load_si128(inputPtr++);
|
||||||
y = _mm_load_si128(parityPtr++);
|
y = _mm_load_si128(parityPtr++);
|
||||||
|
|
|
@ -111,7 +111,8 @@ void parse_args(int argc, char **argv) {
|
||||||
cfi = atoi(argv[optind]);
|
cfi = atoi(argv[optind]);
|
||||||
break;
|
break;
|
||||||
case 'x':
|
case 'x':
|
||||||
strncpy(mimo_type_str, argv[optind], 32);
|
strncpy(mimo_type_str, argv[optind], sizeof(mimo_type_str));
|
||||||
|
mimo_type_str[sizeof(mimo_type_str)-1] = 0;
|
||||||
break;
|
break;
|
||||||
case 'p':
|
case 'p':
|
||||||
pmi = (uint32_t) atoi(argv[optind]);
|
pmi = (uint32_t) atoi(argv[optind]);
|
||||||
|
|
|
@ -97,7 +97,11 @@ char* rf_soapy_devname(void* h)
|
||||||
|
|
||||||
bool rf_soapy_rx_wait_lo_locked(void *h)
|
bool rf_soapy_rx_wait_lo_locked(void *h)
|
||||||
{
|
{
|
||||||
printf("TODO: implement rf_soapy_rx_wait_lo_locked()\n");
|
rf_soapy_handler_t *handler = (rf_soapy_handler_t*)h;
|
||||||
|
char *ret = SoapySDRDevice_readChannelSensor(handler->device, SOAPY_SDR_RX, 0, "lo_locked");
|
||||||
|
if (ret != NULL) {
|
||||||
|
return (strcmp(ret, "true") == 0 ? true : false);
|
||||||
|
}
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -212,7 +216,7 @@ int rf_soapy_open_multi(char *args, void **h, uint32_t nof_rx_antennas)
|
||||||
|
|
||||||
SoapySDRDevice *sdr = SoapySDRDevice_make(&(soapy_args[0]));
|
SoapySDRDevice *sdr = SoapySDRDevice_make(&(soapy_args[0]));
|
||||||
if (sdr == NULL) {
|
if (sdr == NULL) {
|
||||||
printf("failed to create SOAPY object\n");
|
printf("Failed to create Soapy object\n");
|
||||||
return SRSLTE_ERROR;
|
return SRSLTE_ERROR;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -225,7 +229,7 @@ int rf_soapy_open_multi(char *args, void **h, uint32_t nof_rx_antennas)
|
||||||
handler->rx_stream_active = false;
|
handler->rx_stream_active = false;
|
||||||
handler->devname = devname;
|
handler->devname = devname;
|
||||||
if(SoapySDRDevice_getNumChannels(handler->device,SOAPY_SDR_RX) > 0){
|
if(SoapySDRDevice_getNumChannels(handler->device,SOAPY_SDR_RX) > 0){
|
||||||
printf("setting up RX stream\n");
|
printf("Setting up RX stream\n");
|
||||||
if(SoapySDRDevice_setupStream(handler->device, &(handler->rxStream), SOAPY_SDR_RX, SOAPY_SDR_CF32, NULL, 0, NULL) != 0) {
|
if(SoapySDRDevice_setupStream(handler->device, &(handler->rxStream), SOAPY_SDR_RX, SOAPY_SDR_CF32, NULL, 0, NULL) != 0) {
|
||||||
printf("Rx setupStream fail: %s\n", SoapySDRDevice_lastError());
|
printf("Rx setupStream fail: %s\n", SoapySDRDevice_lastError());
|
||||||
return SRSLTE_ERROR;
|
return SRSLTE_ERROR;
|
||||||
|
@ -233,19 +237,27 @@ int rf_soapy_open_multi(char *args, void **h, uint32_t nof_rx_antennas)
|
||||||
}
|
}
|
||||||
|
|
||||||
if(SoapySDRDevice_getNumChannels(handler->device,SOAPY_SDR_TX) > 0){
|
if(SoapySDRDevice_getNumChannels(handler->device,SOAPY_SDR_TX) > 0){
|
||||||
printf("setting up TX stream\n");
|
printf("Setting up TX stream\n");
|
||||||
if (SoapySDRDevice_setupStream(handler->device, &(handler->txStream), SOAPY_SDR_TX, SOAPY_SDR_CF32, NULL, 0, NULL) != 0) {
|
if (SoapySDRDevice_setupStream(handler->device, &(handler->txStream), SOAPY_SDR_TX, SOAPY_SDR_CF32, NULL, 0, NULL) != 0) {
|
||||||
printf("Tx setupStream fail: %s\n", SoapySDRDevice_lastError());
|
printf("Tx setupStream fail: %s\n", SoapySDRDevice_lastError());
|
||||||
return SRSLTE_ERROR;
|
return SRSLTE_ERROR;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// list device sensors
|
||||||
size_t sensor_length;
|
size_t sensor_length;
|
||||||
char** sensors;
|
char** sensors;
|
||||||
sensors = SoapySDRDevice_listSensors(handler->device, &sensor_length);
|
sensors = SoapySDRDevice_listSensors(handler->device, &sensor_length);
|
||||||
for(int i = 0; i < sensor_length;i++)
|
printf("Available device sensors: \n");
|
||||||
{
|
for(int i = 0; i < sensor_length; i++) {
|
||||||
printf("available sensors are : \n");
|
printf(" - %s\n", sensors[i]);
|
||||||
puts(sensors[i]);
|
}
|
||||||
|
|
||||||
|
// list channel sensors
|
||||||
|
sensors = SoapySDRDevice_listChannelSensors(handler->device, SOAPY_SDR_RX, 0, &sensor_length);
|
||||||
|
printf("Available sensors for RX channel 0: \n");
|
||||||
|
for(int i = 0; i < sensor_length; i++) {
|
||||||
|
printf(" - %s\n", sensors[i]);
|
||||||
}
|
}
|
||||||
|
|
||||||
return SRSLTE_SUCCESS;
|
return SRSLTE_SUCCESS;
|
||||||
|
@ -408,6 +420,7 @@ int rf_soapy_recv_with_time_multi(void *h,
|
||||||
rf_soapy_handler_t *handler = (rf_soapy_handler_t*) h;
|
rf_soapy_handler_t *handler = (rf_soapy_handler_t*) h;
|
||||||
int flags; //flags set by receive operation
|
int flags; //flags set by receive operation
|
||||||
int num_channels = 1; // temp
|
int num_channels = 1; // temp
|
||||||
|
const long timeoutUs = 1000000; // arbitrarily chosen
|
||||||
|
|
||||||
int trials = 0;
|
int trials = 0;
|
||||||
int ret = 0;
|
int ret = 0;
|
||||||
|
@ -424,7 +437,7 @@ int rf_soapy_recv_with_time_multi(void *h,
|
||||||
cf_t *data_c = (cf_t*) data[i];
|
cf_t *data_c = (cf_t*) data[i];
|
||||||
buffs_ptr[i] = &data_c[n];
|
buffs_ptr[i] = &data_c[n];
|
||||||
}
|
}
|
||||||
ret = SoapySDRDevice_readStream(handler->device, handler->rxStream, buffs_ptr, rx_samples, &flags, &timeNs, 1000000);
|
ret = SoapySDRDevice_readStream(handler->device, handler->rxStream, buffs_ptr, rx_samples, &flags, &timeNs, timeoutUs);
|
||||||
if(ret < 0) {
|
if(ret < 0) {
|
||||||
// continue when getting overflows
|
// continue when getting overflows
|
||||||
if (ret == SOAPY_SDR_OVERFLOW) {
|
if (ret == SOAPY_SDR_OVERFLOW) {
|
||||||
|
@ -447,8 +460,6 @@ int rf_soapy_recv_with_time_multi(void *h,
|
||||||
trials++;
|
trials++;
|
||||||
} while (n < nsamples && trials < 100);
|
} while (n < nsamples && trials < 100);
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
return n;
|
return n;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -37,6 +37,10 @@ add_executable(test_eea2 test_eea2.cc)
|
||||||
target_link_libraries(test_eea2 srslte_common ${CMAKE_THREAD_LIBS_INIT})
|
target_link_libraries(test_eea2 srslte_common ${CMAKE_THREAD_LIBS_INIT})
|
||||||
add_test(test_eea2 test_eea2)
|
add_test(test_eea2 test_eea2)
|
||||||
|
|
||||||
|
add_executable(test_f12345 test_f12345.cc)
|
||||||
|
target_link_libraries(test_f12345 srslte_common ${CMAKE_THREAD_LIBS_INIT})
|
||||||
|
add_test(test_f12345 test_f12345)
|
||||||
|
|
||||||
add_executable(log_filter_test log_filter_test.cc)
|
add_executable(log_filter_test log_filter_test.cc)
|
||||||
target_link_libraries(log_filter_test srslte_phy srslte_common srslte_phy ${SEC_LIBRARIES} ${CMAKE_THREAD_LIBS_INIT} ${Boost_LIBRARIES})
|
target_link_libraries(log_filter_test srslte_phy srslte_common srslte_phy ${SEC_LIBRARIES} ${CMAKE_THREAD_LIBS_INIT} ${Boost_LIBRARIES})
|
||||||
|
|
||||||
|
|
|
@ -0,0 +1,170 @@
|
||||||
|
/*
|
||||||
|
* Includes
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <stdlib.h>
|
||||||
|
#include <stdio.h>
|
||||||
|
#include <assert.h>
|
||||||
|
|
||||||
|
#include "srslte/common/liblte_security.h"
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Prototypes
|
||||||
|
*/
|
||||||
|
|
||||||
|
int32 arrcmp(uint8_t const * const a, uint8_t const * const b, uint32 len) {
|
||||||
|
uint32 i = 0;
|
||||||
|
|
||||||
|
for (i = 0; i < len; i++) {
|
||||||
|
if (a[i] != b[i]) {
|
||||||
|
return a[i] - b[i];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
void arrprint(uint8_t const * const a, uint32 len) {
|
||||||
|
uint32 i = 0;
|
||||||
|
|
||||||
|
for (i = 0; i < len; i++) {
|
||||||
|
printf("0x%02x ", a[i]);
|
||||||
|
if ((i%16==0) && i)
|
||||||
|
printf("\n");
|
||||||
|
}
|
||||||
|
printf("\n");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Tests
|
||||||
|
*
|
||||||
|
* Document Reference: 35.208 e00
|
||||||
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Functions
|
||||||
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
void test_set_2()
|
||||||
|
{
|
||||||
|
LIBLTE_ERROR_ENUM err_lte = LIBLTE_ERROR_INVALID_INPUTS;
|
||||||
|
int32 err_cmp = 0;
|
||||||
|
|
||||||
|
uint8_t k[] = {0x46, 0x5b, 0x5c, 0xe8, 0xb1, 0x99, 0xb4, 0x9f, 0xaa, 0x5f, 0x0a, 0x2e, 0xe2, 0x38, 0xa6, 0xbc};
|
||||||
|
uint8_t rand[] = {0x23, 0x55, 0x3c, 0xbe, 0x96, 0x37, 0xa8, 0x9d, 0x21, 0x8a, 0xe6, 0x4d, 0xae, 0x47, 0xbf, 0x35};
|
||||||
|
uint8_t sqn[] = {0xff, 0x9b, 0xb4, 0xd0, 0xb6, 0x07};
|
||||||
|
uint8_t amf[] = {0xb9, 0xb9};
|
||||||
|
uint8_t op[] = {0xcd, 0xc2, 0x02, 0xd5, 0x12, 0x3e, 0x20, 0xf6, 0x2b, 0x6d, 0x67, 0x6a, 0xc7, 0x2c, 0xb3, 0x18};
|
||||||
|
// f1
|
||||||
|
|
||||||
|
uint8_t mac_o[8];
|
||||||
|
err_lte = liblte_security_milenage_f1(k,
|
||||||
|
op,
|
||||||
|
rand,
|
||||||
|
sqn,
|
||||||
|
amf,
|
||||||
|
mac_o);
|
||||||
|
assert(err_lte == LIBLTE_SUCCESS);
|
||||||
|
|
||||||
|
arrprint(mac_o, sizeof(mac_o));
|
||||||
|
|
||||||
|
uint8_t mac_a[] = {0x4a, 0x9f, 0xfa, 0xc3, 0x54, 0xdf, 0xaf, 0xb3};
|
||||||
|
|
||||||
|
// compare mac a
|
||||||
|
err_cmp = arrcmp(mac_o, mac_a, sizeof(mac_a));
|
||||||
|
assert(err_cmp == 0);
|
||||||
|
|
||||||
|
// f1 star
|
||||||
|
|
||||||
|
uint8_t mac_so[8];
|
||||||
|
err_lte = liblte_security_milenage_f1_star(k,
|
||||||
|
op,
|
||||||
|
rand,
|
||||||
|
sqn,
|
||||||
|
amf,
|
||||||
|
mac_so);
|
||||||
|
|
||||||
|
assert(err_lte == LIBLTE_SUCCESS);
|
||||||
|
|
||||||
|
uint8_t mac_s[] = {0x01, 0xcf, 0xaf, 0x9e, 0xc4, 0xe8, 0x71, 0xe9};
|
||||||
|
|
||||||
|
arrprint(mac_so, sizeof(mac_so));
|
||||||
|
|
||||||
|
err_cmp = arrcmp(mac_so, mac_s, sizeof(mac_s));
|
||||||
|
assert(err_cmp == 0);
|
||||||
|
|
||||||
|
// f2345
|
||||||
|
uint8_t res_o[8];
|
||||||
|
uint8_t ck_o[16];
|
||||||
|
uint8_t ik_o[16];
|
||||||
|
uint8_t ak_o[6];
|
||||||
|
|
||||||
|
err_lte = liblte_security_milenage_f2345(k,
|
||||||
|
op,
|
||||||
|
rand,
|
||||||
|
res_o,
|
||||||
|
ck_o,
|
||||||
|
ik_o,
|
||||||
|
ak_o);
|
||||||
|
|
||||||
|
assert(err_lte == LIBLTE_SUCCESS);
|
||||||
|
|
||||||
|
uint8_t res[] = {0xa5, 0x42, 0x11, 0xd5, 0xe3, 0xba, 0x50, 0xbf};
|
||||||
|
uint8_t ck[] = {0xb4, 0x0b, 0xa9, 0xa3, 0xc5, 0x8b, 0x2a, 0x05, 0xbb, 0xf0, 0xd9, 0x87, 0xb2, 0x1b, 0xf8, 0xcb};
|
||||||
|
uint8_t ik[] = {0xf7, 0x69, 0xbc, 0xd7, 0x51, 0x04, 0x46, 0x04, 0x12, 0x76, 0x72, 0x71, 0x1c, 0x6d, 0x34, 0x41};
|
||||||
|
uint8_t ak[] = {0xaa, 0x68, 0x9c, 0x64, 0x83, 0x70};
|
||||||
|
|
||||||
|
// RESPONSE
|
||||||
|
arrprint(res_o, sizeof(res_o));
|
||||||
|
|
||||||
|
err_cmp = arrcmp(res_o, res, sizeof(res));
|
||||||
|
assert(err_cmp == 0);
|
||||||
|
|
||||||
|
// CK
|
||||||
|
arrprint(ck_o, sizeof(ck_o));
|
||||||
|
|
||||||
|
err_cmp = arrcmp(ck_o, ck, sizeof(ck));
|
||||||
|
assert(err_cmp == 0);
|
||||||
|
|
||||||
|
// IK
|
||||||
|
arrprint(ik_o, sizeof(ik_o));
|
||||||
|
err_cmp = arrcmp(ik_o, ik, sizeof(ik));
|
||||||
|
assert(err_cmp == 0);
|
||||||
|
|
||||||
|
// AK
|
||||||
|
arrprint(ak_o, sizeof(ak_o));
|
||||||
|
err_cmp = arrcmp(ak_o, ak, sizeof(ak));
|
||||||
|
assert(err_cmp == 0);
|
||||||
|
|
||||||
|
// f star
|
||||||
|
uint8_t ak_star_o[6];
|
||||||
|
|
||||||
|
err_lte = liblte_security_milenage_f5_star(k, op, rand, ak_star_o);
|
||||||
|
assert(err_lte == LIBLTE_SUCCESS);
|
||||||
|
|
||||||
|
arrprint(ak_star_o, sizeof(ak_star_o));
|
||||||
|
uint8_t ak_star[] = {0x45, 0x1e, 0x8b, 0xec, 0xa4, 0x3b};
|
||||||
|
err_cmp = arrcmp(ak_star_o, ak_star, sizeof(ak_star));
|
||||||
|
assert(err_cmp == 0);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
Own test sets
|
||||||
|
*/
|
||||||
|
|
||||||
|
int main(int argc, char * argv[]) {
|
||||||
|
test_set_2();
|
||||||
|
/*
|
||||||
|
test_set_3();
|
||||||
|
test_set_4();
|
||||||
|
test_set_5();
|
||||||
|
test_set_6();
|
||||||
|
*/
|
||||||
|
}
|
|
@ -716,6 +716,7 @@ int enb::parse_sib9(std::string filename, LIBLTE_RRC_SYS_INFO_BLOCK_TYPE_9_STRUC
|
||||||
data->hnb_name_present = true;
|
data->hnb_name_present = true;
|
||||||
if (name_enabled) {
|
if (name_enabled) {
|
||||||
strncpy((char*) data->hnb_name, hnb_name.c_str(), 48);
|
strncpy((char*) data->hnb_name, hnb_name.c_str(), 48);
|
||||||
|
data->hnb_name[47] = 0;
|
||||||
data->hnb_name_size = strnlen(hnb_name.c_str(), 48);
|
data->hnb_name_size = strnlen(hnb_name.c_str(), 48);
|
||||||
} else if (hex_enabled) {
|
} else if (hex_enabled) {
|
||||||
data->hnb_name_size = HexToBytes(hex_value, data->hnb_name, 48);
|
data->hnb_name_size = HexToBytes(hex_value, data->hnb_name, 48);
|
||||||
|
|
|
@ -212,6 +212,7 @@ bool sched_ue::pucch_sr_collision(uint32_t current_tti, uint32_t n_cce)
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
srslte_pucch_sched_t pucch_sched;
|
srslte_pucch_sched_t pucch_sched;
|
||||||
|
pucch_sched.sps_enabled = false;
|
||||||
pucch_sched.n_pucch_sr = cfg.sr_N_pucch;
|
pucch_sched.n_pucch_sr = cfg.sr_N_pucch;
|
||||||
pucch_sched.n_pucch_2 = cfg.n_pucch_cqi;
|
pucch_sched.n_pucch_2 = cfg.n_pucch_cqi;
|
||||||
pucch_sched.N_pucch_1 = cfg.pucch_cfg.n1_pucch_an;
|
pucch_sched.N_pucch_1 = cfg.pucch_cfg.n1_pucch_an;
|
||||||
|
|
|
@ -46,6 +46,8 @@ namespace srsepc{
|
||||||
typedef struct{
|
typedef struct{
|
||||||
std::string auth_algo;
|
std::string auth_algo;
|
||||||
std::string db_file;
|
std::string db_file;
|
||||||
|
uint16_t mcc;
|
||||||
|
uint16_t mnc;
|
||||||
}hss_args_t;
|
}hss_args_t;
|
||||||
|
|
||||||
typedef struct{
|
typedef struct{
|
||||||
|
@ -99,6 +101,8 @@ private:
|
||||||
/*Logs*/
|
/*Logs*/
|
||||||
srslte::log_filter *m_hss_log;
|
srslte::log_filter *m_hss_log;
|
||||||
|
|
||||||
|
uint16_t mcc;
|
||||||
|
uint16_t mnc;
|
||||||
};
|
};
|
||||||
|
|
||||||
} // namespace srsepc
|
} // namespace srsepc
|
||||||
|
|
|
@ -90,7 +90,10 @@ hss::init(hss_args_t *hss_args, srslte::log_filter *hss_log)
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
m_hss_log->info("HSS Initialized. DB file %s, authentication algorithm %s\n", hss_args->db_file.c_str(),hss_args->auth_algo.c_str());
|
mcc = hss_args->mcc;
|
||||||
|
mnc = hss_args->mnc;
|
||||||
|
|
||||||
|
m_hss_log->info("HSS Initialized. DB file %s, authentication algorithm %s, MCC: %d, MNC: %d\n", hss_args->db_file.c_str(),hss_args->auth_algo.c_str(), mcc, mnc);
|
||||||
m_hss_log->console("HSS Initialized\n");
|
m_hss_log->console("HSS Initialized\n");
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
@ -203,8 +206,6 @@ hss::gen_auth_info_answer_milenage(uint64_t imsi, uint8_t *k_asme, uint8_t *autn
|
||||||
uint8_t ak[6];
|
uint8_t ak[6];
|
||||||
uint8_t mac[8];
|
uint8_t mac[8];
|
||||||
|
|
||||||
uint16_t mcc=61441; //001
|
|
||||||
uint16_t mnc=65281; //01
|
|
||||||
|
|
||||||
if(!get_k_amf_op(imsi,k,amf,op))
|
if(!get_k_amf_op(imsi,k,amf,op))
|
||||||
{
|
{
|
||||||
|
@ -221,6 +222,14 @@ hss::gen_auth_info_answer_milenage(uint64_t imsi, uint8_t *k_asme, uint8_t *autn
|
||||||
ik,
|
ik,
|
||||||
ak);
|
ak);
|
||||||
|
|
||||||
|
m_hss_log->debug_hex(k, 16, "User Key : ");
|
||||||
|
m_hss_log->debug_hex(op, 16, "User OP : ");
|
||||||
|
m_hss_log->debug_hex(rand, 16, "User Rand : ");
|
||||||
|
m_hss_log->debug_hex(xres, 8, "User XRES: ");
|
||||||
|
m_hss_log->debug_hex(ck, 16, "User CK: ");
|
||||||
|
m_hss_log->debug_hex(ik, 16, "User IK: ");
|
||||||
|
m_hss_log->debug_hex(ak, 6, "User AK: ");
|
||||||
|
|
||||||
security_milenage_f1( k,
|
security_milenage_f1( k,
|
||||||
op,
|
op,
|
||||||
rand,
|
rand,
|
||||||
|
@ -228,6 +237,9 @@ hss::gen_auth_info_answer_milenage(uint64_t imsi, uint8_t *k_asme, uint8_t *autn
|
||||||
amf,
|
amf,
|
||||||
mac);
|
mac);
|
||||||
|
|
||||||
|
m_hss_log->debug_hex(sqn, 6, "User SQN : ");
|
||||||
|
m_hss_log->debug_hex(mac, 8, "User MAC : ");
|
||||||
|
|
||||||
// Generate K_asme
|
// Generate K_asme
|
||||||
security_generate_k_asme( ck,
|
security_generate_k_asme( ck,
|
||||||
ik,
|
ik,
|
||||||
|
@ -237,6 +249,9 @@ hss::gen_auth_info_answer_milenage(uint64_t imsi, uint8_t *k_asme, uint8_t *autn
|
||||||
mnc,
|
mnc,
|
||||||
k_asme);
|
k_asme);
|
||||||
|
|
||||||
|
m_hss_log->debug("User MCC : %x MNC : %x \n", mcc, mnc);
|
||||||
|
m_hss_log->debug_hex(k_asme, 32, "User k_asme : ");
|
||||||
|
|
||||||
//Generate AUTN (autn = sqn ^ ak |+| amf |+| mac)
|
//Generate AUTN (autn = sqn ^ ak |+| amf |+| mac)
|
||||||
for(int i=0;i<6;i++ )
|
for(int i=0;i<6;i++ )
|
||||||
{
|
{
|
||||||
|
@ -251,9 +266,7 @@ hss::gen_auth_info_answer_milenage(uint64_t imsi, uint8_t *k_asme, uint8_t *autn
|
||||||
autn[8+i]=mac[i];
|
autn[8+i]=mac[i];
|
||||||
}
|
}
|
||||||
|
|
||||||
m_hss_log->debug_hex(sqn, 6, "User SQN : ");
|
m_hss_log->debug_hex(autn, 16, "User AUTN: ");
|
||||||
m_hss_log->debug_hex(autn, 8, "User AUTN: ");
|
|
||||||
m_hss_log->debug_hex(xres, 8, "User XRES: ");
|
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
@ -274,9 +287,6 @@ hss::gen_auth_info_answer_xor(uint64_t imsi, uint8_t *k_asme, uint8_t *autn, uin
|
||||||
uint8_t ak[6];
|
uint8_t ak[6];
|
||||||
uint8_t mac[8];
|
uint8_t mac[8];
|
||||||
|
|
||||||
uint16_t mcc=61441; //001
|
|
||||||
uint16_t mnc=65281; //01
|
|
||||||
|
|
||||||
int i = 0;
|
int i = 0;
|
||||||
|
|
||||||
if(!get_k_amf_op(imsi,k,amf,op))
|
if(!get_k_amf_op(imsi,k,amf,op))
|
||||||
|
@ -300,6 +310,14 @@ hss::gen_auth_info_answer_xor(uint64_t imsi, uint8_t *k_asme, uint8_t *autn, uin
|
||||||
ak[i] = xdout[i+3];
|
ak[i] = xdout[i+3];
|
||||||
}
|
}
|
||||||
|
|
||||||
|
m_hss_log->debug_hex(k, 16, "User Key : ");
|
||||||
|
m_hss_log->debug_hex(op, 16, "User OP : ");
|
||||||
|
m_hss_log->debug_hex(rand, 16, "User Rand : ");
|
||||||
|
m_hss_log->debug_hex(xres, 8, "User XRES: ");
|
||||||
|
m_hss_log->debug_hex(ck, 16, "User CK: ");
|
||||||
|
m_hss_log->debug_hex(ik, 16, "User IK: ");
|
||||||
|
m_hss_log->debug_hex(ak, 6, "User AK: ");
|
||||||
|
|
||||||
// Generate cdout
|
// Generate cdout
|
||||||
for(i=0; i<6; i++) {
|
for(i=0; i<6; i++) {
|
||||||
cdout[i] = sqn[i];
|
cdout[i] = sqn[i];
|
||||||
|
@ -313,6 +331,9 @@ hss::gen_auth_info_answer_xor(uint64_t imsi, uint8_t *k_asme, uint8_t *autn, uin
|
||||||
mac[i] = xdout[i] ^ cdout[i];
|
mac[i] = xdout[i] ^ cdout[i];
|
||||||
}
|
}
|
||||||
|
|
||||||
|
m_hss_log->debug_hex(sqn, 6, "User SQN : ");
|
||||||
|
m_hss_log->debug_hex(mac, 8, "User MAC : ");
|
||||||
|
|
||||||
//Generate AUTN (autn = sqn ^ ak |+| amf |+| mac)
|
//Generate AUTN (autn = sqn ^ ak |+| amf |+| mac)
|
||||||
for(int i=0;i<6;i++ )
|
for(int i=0;i<6;i++ )
|
||||||
{
|
{
|
||||||
|
@ -336,6 +357,9 @@ hss::gen_auth_info_answer_xor(uint64_t imsi, uint8_t *k_asme, uint8_t *autn, uin
|
||||||
mnc,
|
mnc,
|
||||||
k_asme);
|
k_asme);
|
||||||
|
|
||||||
|
m_hss_log->debug("User MCC : %x MNC : %x \n", mcc, mnc);
|
||||||
|
m_hss_log->debug_hex(k_asme, 32, "User k_asme : ");
|
||||||
|
|
||||||
//Generate AUTN (autn = sqn ^ ak |+| amf |+| mac)
|
//Generate AUTN (autn = sqn ^ ak |+| amf |+| mac)
|
||||||
for(int i=0;i<6;i++ )
|
for(int i=0;i<6;i++ )
|
||||||
{
|
{
|
||||||
|
@ -350,9 +374,7 @@ hss::gen_auth_info_answer_xor(uint64_t imsi, uint8_t *k_asme, uint8_t *autn, uin
|
||||||
autn[8+i]=mac[i];
|
autn[8+i]=mac[i];
|
||||||
}
|
}
|
||||||
|
|
||||||
m_hss_log->debug_hex(sqn, 6, "User SQN : ");
|
|
||||||
m_hss_log->debug_hex(autn, 8, "User AUTN: ");
|
m_hss_log->debug_hex(autn, 8, "User AUTN: ");
|
||||||
m_hss_log->debug_hex(xres, 8, "User XRES: ");
|
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
|
@ -189,10 +189,18 @@ parse_args(all_args_t *args, int argc, char* argv[]) {
|
||||||
}
|
}
|
||||||
// Convert MCC/MNC strings
|
// Convert MCC/MNC strings
|
||||||
if(!srslte::string_to_mcc(mcc, &args->mme_args.s1ap_args.mcc)) {
|
if(!srslte::string_to_mcc(mcc, &args->mme_args.s1ap_args.mcc)) {
|
||||||
cout << "Error parsing enb.mcc:" << mcc << " - must be a 3-digit string." << endl;
|
cout << "Error parsing mme.mcc:" << mcc << " - must be a 3-digit string." << endl;
|
||||||
}
|
}
|
||||||
if(!srslte::string_to_mnc(mnc, &args->mme_args.s1ap_args.mnc)) {
|
if(!srslte::string_to_mnc(mnc, &args->mme_args.s1ap_args.mnc)) {
|
||||||
cout << "Error parsing enb.mnc:" << mnc << " - must be a 2 or 3-digit string." << endl;
|
cout << "Error parsing mme.mnc:" << mnc << " - must be a 2 or 3-digit string." << endl;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Convert MCC/MNC strings
|
||||||
|
if(!srslte::string_to_mcc(mcc, &args->hss_args.mcc)) {
|
||||||
|
cout << "Error parsing mme.mcc:" << mcc << " - must be a 3-digit string." << endl;
|
||||||
|
}
|
||||||
|
if(!srslte::string_to_mnc(mnc, &args->hss_args.mnc)) {
|
||||||
|
cout << "Error parsing mme.mnc:" << mnc << " - must be a 2 or 3-digit string." << endl;
|
||||||
}
|
}
|
||||||
|
|
||||||
args->mme_args.s1ap_args.mme_bind_addr = mme_bind_addr;
|
args->mme_args.s1ap_args.mme_bind_addr = mme_bind_addr;
|
||||||
|
|
|
@ -241,7 +241,7 @@ s1ap_nas_transport::handle_nas_imsi_attach_request(uint32_t enb_ue_s1ap_id,
|
||||||
{
|
{
|
||||||
uint8_t k_asme[32];
|
uint8_t k_asme[32];
|
||||||
uint8_t autn[16];
|
uint8_t autn[16];
|
||||||
uint8_t rand[6];
|
uint8_t rand[16];
|
||||||
uint8_t xres[8];
|
uint8_t xres[8];
|
||||||
|
|
||||||
ue_ctx_t ue_ctx;
|
ue_ctx_t ue_ctx;
|
||||||
|
@ -584,7 +584,7 @@ bool
|
||||||
s1ap_nas_transport::handle_identity_response(srslte::byte_buffer_t *nas_msg, ue_ctx_t* ue_ctx, srslte::byte_buffer_t *reply_msg, bool *reply_flag)
|
s1ap_nas_transport::handle_identity_response(srslte::byte_buffer_t *nas_msg, ue_ctx_t* ue_ctx, srslte::byte_buffer_t *reply_msg, bool *reply_flag)
|
||||||
{
|
{
|
||||||
uint8_t autn[16];
|
uint8_t autn[16];
|
||||||
uint8_t rand[6];
|
uint8_t rand[16];
|
||||||
uint8_t xres[8];
|
uint8_t xres[8];
|
||||||
|
|
||||||
LIBLTE_MME_ID_RESPONSE_MSG_STRUCT id_resp;
|
LIBLTE_MME_ID_RESPONSE_MSG_STRUCT id_resp;
|
||||||
|
|
|
@ -202,6 +202,7 @@ srslte::error_t gw::init_if(char *err_str)
|
||||||
memset(&ifr, 0, sizeof(ifr));
|
memset(&ifr, 0, sizeof(ifr));
|
||||||
ifr.ifr_flags = IFF_TUN | IFF_NO_PI;
|
ifr.ifr_flags = IFF_TUN | IFF_NO_PI;
|
||||||
strncpy(ifr.ifr_ifrn.ifrn_name, dev, IFNAMSIZ);
|
strncpy(ifr.ifr_ifrn.ifrn_name, dev, IFNAMSIZ);
|
||||||
|
ifr.ifr_ifrn.ifrn_name[IFNAMSIZ-1] = 0;
|
||||||
if(0 > ioctl(tun_fd, TUNSETIFF, &ifr))
|
if(0 > ioctl(tun_fd, TUNSETIFF, &ifr))
|
||||||
{
|
{
|
||||||
err_str = strerror(errno);
|
err_str = strerror(errno);
|
||||||
|
|
Loading…
Reference in New Issue