Read PLMN list configuration into RRC/S1AP
This commit is contained in:
@@ -624,7 +624,14 @@ int RCconfig_RRC(MessageDef *msg_p, uint32_t i, eNB_RRC_INST *rrc) {
|
|||||||
for (k=0; k <num_enbs ; k++) {
|
for (k=0; k <num_enbs ; k++) {
|
||||||
if (strcmp(ENBSParams[ENB_ACTIVE_ENBS_IDX].strlistptr[k], *(ENBParamList.paramarray[i][ENB_ENB_NAME_IDX].strptr) )== 0) {
|
if (strcmp(ENBSParams[ENB_ACTIVE_ENBS_IDX].strlistptr[k], *(ENBParamList.paramarray[i][ENB_ENB_NAME_IDX].strptr) )== 0) {
|
||||||
char enbpath[MAX_OPTNAME_SIZE + 8];
|
char enbpath[MAX_OPTNAME_SIZE + 8];
|
||||||
|
sprintf(enbpath,"%s.[%i]",ENB_CONFIG_STRING_ENB_LIST,k);
|
||||||
|
|
||||||
|
paramdef_t PLMNParams[] = PLMNPARAMS_DESC;
|
||||||
|
paramlist_def_t PLMNParamList = {ENB_CONFIG_STRING_PLMN_LIST, NULL, 0};
|
||||||
|
/* map parameter checking array instances to parameter definition array instances */
|
||||||
|
checkedparam_t config_check_PLMNParams [] = PLMNPARAMS_CHECK;
|
||||||
|
for (int I = 0; I < sizeof(PLMNParams) / sizeof(paramdef_t); ++I)
|
||||||
|
PLMNParams[I].chkPptr = &(config_check_PLMNParams[I]);
|
||||||
|
|
||||||
RRC_CONFIGURATION_REQ (msg_p).cell_identity = enb_id;
|
RRC_CONFIGURATION_REQ (msg_p).cell_identity = enb_id;
|
||||||
|
|
||||||
@@ -641,18 +648,36 @@ int RCconfig_RRC(MessageDef *msg_p, uint32_t i, eNB_RRC_INST *rrc) {
|
|||||||
|
|
||||||
enb_properties_loc.properties[enb_properties_loc_index]->eNB_name = strdup(enb_name);
|
enb_properties_loc.properties[enb_properties_loc_index]->eNB_name = strdup(enb_name);
|
||||||
*/
|
*/
|
||||||
RRC_CONFIGURATION_REQ (msg_p).tac = (uint16_t)atoi( *(ENBParamList.paramarray[i][ENB_TRACKING_AREA_CODE_IDX].strptr) );
|
RRC_CONFIGURATION_REQ(msg_p).tac = *ENBParamList.paramarray[i][ENB_TRACKING_AREA_CODE_IDX].uptr;
|
||||||
RRC_CONFIGURATION_REQ (msg_p).mcc = (uint16_t)atoi( *(ENBParamList.paramarray[i][ENB_MOBILE_COUNTRY_CODE_IDX].strptr) );
|
AssertFatal(!ENBParamList.paramarray[i][ENB_MOBILE_COUNTRY_CODE_IDX_OLD].strptr
|
||||||
RRC_CONFIGURATION_REQ (msg_p).mnc = (uint16_t)atoi( *(ENBParamList.paramarray[i][ENB_MOBILE_NETWORK_CODE_IDX].strptr) );
|
&& !ENBParamList.paramarray[i][ENB_MOBILE_NETWORK_CODE_IDX_OLD].strptr,
|
||||||
RRC_CONFIGURATION_REQ (msg_p).mnc_digit_length = strlen(*(ENBParamList.paramarray[i][ENB_MOBILE_NETWORK_CODE_IDX].strptr));
|
"It seems that you use an old configuration file. Please change the existing\n"
|
||||||
AssertFatal((RRC_CONFIGURATION_REQ (msg_p).mnc_digit_length == 2) ||
|
" tracking_area_code = \"1\";\n"
|
||||||
(RRC_CONFIGURATION_REQ (msg_p).mnc_digit_length == 3),
|
" mobile_country_code = \"208\";\n"
|
||||||
"BAD MNC DIGIT LENGTH %d",
|
" mobile_network_code = \"93\";\n"
|
||||||
RRC_CONFIGURATION_REQ (msg_p).mnc_digit_length);
|
"to\n"
|
||||||
|
" tracking_area_code = 1; // no string!!\n"
|
||||||
|
" plmn_list = ( { mcc = 208; mnc = 93; mnc_length = 2; } )\n");
|
||||||
|
|
||||||
|
config_getlist(&PLMNParamList, PLMNParams, sizeof(PLMNParams)/sizeof(paramdef_t), enbpath);
|
||||||
|
|
||||||
|
if (PLMNParamList.numelt < 1 || PLMNParamList.numelt > 6)
|
||||||
|
AssertFatal(0, "The number of PLMN IDs must be in [1,6], but is %d\n",
|
||||||
|
PLMNParamList.numelt);
|
||||||
|
RRC_CONFIGURATION_REQ(msg_p).num_plmn = PLMNParamList.numelt;
|
||||||
|
|
||||||
|
for (int l = 0; l < PLMNParamList.numelt; ++l) {
|
||||||
|
RRC_CONFIGURATION_REQ(msg_p).mcc[l] = *PLMNParamList.paramarray[l][ENB_MOBILE_COUNTRY_CODE_IDX].uptr;
|
||||||
|
RRC_CONFIGURATION_REQ(msg_p).mnc[l] = *PLMNParamList.paramarray[l][ENB_MOBILE_NETWORK_CODE_IDX].uptr;
|
||||||
|
RRC_CONFIGURATION_REQ(msg_p).mnc_digit_length[l] = *PLMNParamList.paramarray[l][ENB_MNC_DIGIT_LENGTH].u8ptr;
|
||||||
|
AssertFatal(RRC_CONFIGURATION_REQ(msg_p).mnc_digit_length[l] == 3
|
||||||
|
|| RRC_CONFIGURATION_REQ(msg_p).mnc[l] < 100,
|
||||||
|
"MNC %d cannot be encoded in two digits as requested (change mnc_digit_length to 3)\n",
|
||||||
|
RRC_CONFIGURATION_REQ(msg_p).mnc[l]);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
// Parse optional physical parameters
|
// Parse optional physical parameters
|
||||||
sprintf(enbpath,"%s.[%i]",ENB_CONFIG_STRING_ENB_LIST,k),
|
|
||||||
config_getlist( &CCsParamList,NULL,0,enbpath);
|
config_getlist( &CCsParamList,NULL,0,enbpath);
|
||||||
|
|
||||||
LOG_I(RRC,"num component carriers %d \n",CCsParamList.numelt);
|
LOG_I(RRC,"num component carriers %d \n",CCsParamList.numelt);
|
||||||
@@ -2246,12 +2271,21 @@ int RCconfig_S1(MessageDef *msg_p, uint32_t i) {
|
|||||||
// search if in active list
|
// search if in active list
|
||||||
for (j=0; j < ENBSParams[ENB_ACTIVE_ENBS_IDX].numelt; j++) {
|
for (j=0; j < ENBSParams[ENB_ACTIVE_ENBS_IDX].numelt; j++) {
|
||||||
if (strcmp(ENBSParams[ENB_ACTIVE_ENBS_IDX].strlistptr[j], *(ENBParamList.paramarray[k][ENB_ENB_NAME_IDX].strptr)) == 0) {
|
if (strcmp(ENBSParams[ENB_ACTIVE_ENBS_IDX].strlistptr[j], *(ENBParamList.paramarray[k][ENB_ENB_NAME_IDX].strptr)) == 0) {
|
||||||
|
paramdef_t PLMNParams[] = PLMNPARAMS_DESC;
|
||||||
|
paramlist_def_t PLMNParamList = {ENB_CONFIG_STRING_PLMN_LIST, NULL, 0};
|
||||||
|
/* map parameter checking array instances to parameter definition array instances */
|
||||||
|
checkedparam_t config_check_PLMNParams [] = PLMNPARAMS_CHECK;
|
||||||
|
for (int I = 0; I < sizeof(PLMNParams) / sizeof(paramdef_t); ++I)
|
||||||
|
PLMNParams[I].chkPptr = &(config_check_PLMNParams[I]);
|
||||||
|
|
||||||
paramdef_t S1Params[] = S1PARAMS_DESC;
|
paramdef_t S1Params[] = S1PARAMS_DESC;
|
||||||
paramlist_def_t S1ParamList = {ENB_CONFIG_STRING_MME_IP_ADDRESS,NULL,0};
|
paramlist_def_t S1ParamList = {ENB_CONFIG_STRING_MME_IP_ADDRESS,NULL,0};
|
||||||
|
|
||||||
paramdef_t SCTPParams[] = SCTPPARAMS_DESC;
|
paramdef_t SCTPParams[] = SCTPPARAMS_DESC;
|
||||||
paramdef_t NETParams[] = NETPARAMS_DESC;
|
paramdef_t NETParams[] = NETPARAMS_DESC;
|
||||||
char aprefix[MAX_OPTNAME_SIZE*2 + 8];
|
|
||||||
|
char aprefix[MAX_OPTNAME_SIZE*2 + 8];
|
||||||
|
sprintf(aprefix,"%s.[%i]",ENB_CONFIG_STRING_ENB_LIST,k);
|
||||||
|
|
||||||
S1AP_REGISTER_ENB_REQ (msg_p).eNB_id = enb_id;
|
S1AP_REGISTER_ENB_REQ (msg_p).eNB_id = enb_id;
|
||||||
|
|
||||||
@@ -2266,17 +2300,35 @@ int RCconfig_S1(MessageDef *msg_p, uint32_t i) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
S1AP_REGISTER_ENB_REQ (msg_p).eNB_name = strdup(*(ENBParamList.paramarray[k][ENB_ENB_NAME_IDX].strptr));
|
S1AP_REGISTER_ENB_REQ (msg_p).eNB_name = strdup(*(ENBParamList.paramarray[k][ENB_ENB_NAME_IDX].strptr));
|
||||||
S1AP_REGISTER_ENB_REQ (msg_p).tac = (uint16_t)atoi(*(ENBParamList.paramarray[k][ENB_TRACKING_AREA_CODE_IDX].strptr));
|
S1AP_REGISTER_ENB_REQ(msg_p).tac = *ENBParamList.paramarray[k][ENB_TRACKING_AREA_CODE_IDX].uptr;
|
||||||
S1AP_REGISTER_ENB_REQ (msg_p).mcc = (uint16_t)atoi(*(ENBParamList.paramarray[k][ENB_MOBILE_COUNTRY_CODE_IDX].strptr));
|
|
||||||
S1AP_REGISTER_ENB_REQ (msg_p).mnc = (uint16_t)atoi(*(ENBParamList.paramarray[k][ENB_MOBILE_NETWORK_CODE_IDX].strptr));
|
AssertFatal(!ENBParamList.paramarray[k][ENB_MOBILE_COUNTRY_CODE_IDX_OLD].strptr
|
||||||
S1AP_REGISTER_ENB_REQ (msg_p).mnc_digit_length = strlen(*(ENBParamList.paramarray[k][ENB_MOBILE_NETWORK_CODE_IDX].strptr));
|
&& !ENBParamList.paramarray[k][ENB_MOBILE_NETWORK_CODE_IDX_OLD].strptr,
|
||||||
S1AP_REGISTER_ENB_REQ (msg_p).default_drx = 0;
|
"It seems that you use an old configuration file. Please change the existing\n"
|
||||||
AssertFatal((S1AP_REGISTER_ENB_REQ (msg_p).mnc_digit_length == 2) ||
|
" tracking_area_code = \"1\";\n"
|
||||||
(S1AP_REGISTER_ENB_REQ (msg_p).mnc_digit_length == 3),
|
" mobile_country_code = \"208\";\n"
|
||||||
"BAD MNC DIGIT LENGTH %d",
|
" mobile_network_code = \"93\";\n"
|
||||||
S1AP_REGISTER_ENB_REQ (msg_p).mnc_digit_length);
|
"to\n"
|
||||||
|
" tracking_area_code = 1; // no string!!\n"
|
||||||
|
" plmn_list = ( { mcc = 208; mnc = 93; mnc_length = 2; } )\n");
|
||||||
|
|
||||||
|
config_getlist(&PLMNParamList, PLMNParams, sizeof(PLMNParams)/sizeof(paramdef_t), aprefix);
|
||||||
|
if (PLMNParamList.numelt < 1 || PLMNParamList.numelt > 6)
|
||||||
|
AssertFatal(0, "The number of PLMN IDs must be in [1,6], but is %d\n",
|
||||||
|
PLMNParamList.numelt);
|
||||||
|
|
||||||
|
S1AP_REGISTER_ENB_REQ(msg_p).num_plmn = PLMNParamList.numelt;
|
||||||
|
for (int l = 0; l < PLMNParamList.numelt; ++l) {
|
||||||
|
S1AP_REGISTER_ENB_REQ(msg_p).mcc[l] = *PLMNParamList.paramarray[l][ENB_MOBILE_COUNTRY_CODE_IDX].uptr;
|
||||||
|
S1AP_REGISTER_ENB_REQ(msg_p).mnc[l] = *PLMNParamList.paramarray[l][ENB_MOBILE_NETWORK_CODE_IDX].uptr;
|
||||||
|
S1AP_REGISTER_ENB_REQ(msg_p).mnc_digit_length[l] = *PLMNParamList.paramarray[l][ENB_MNC_DIGIT_LENGTH].u8ptr;
|
||||||
|
AssertFatal(S1AP_REGISTER_ENB_REQ(msg_p).mnc_digit_length[l] == 3
|
||||||
|
|| S1AP_REGISTER_ENB_REQ(msg_p).mnc[l] < 100,
|
||||||
|
"MNC %d cannot be encoded in two digits as requested (change mnc_digit_length to 3)\n",
|
||||||
|
S1AP_REGISTER_ENB_REQ(msg_p).mnc[l]);
|
||||||
|
}
|
||||||
|
S1AP_REGISTER_ENB_REQ(msg_p).default_drx = 0;
|
||||||
|
|
||||||
sprintf(aprefix,"%s.[%i]",ENB_CONFIG_STRING_ENB_LIST,k);
|
|
||||||
config_getlist( &S1ParamList,S1Params,sizeof(S1Params)/sizeof(paramdef_t),aprefix);
|
config_getlist( &S1ParamList,S1Params,sizeof(S1Params)/sizeof(paramdef_t),aprefix);
|
||||||
|
|
||||||
S1AP_REGISTER_ENB_REQ (msg_p).nb_mme = 0;
|
S1AP_REGISTER_ENB_REQ (msg_p).nb_mme = 0;
|
||||||
|
|||||||
@@ -185,8 +185,8 @@ typedef enum {
|
|||||||
#define ENB_CONFIG_STRING_CELL_TYPE "cell_type"
|
#define ENB_CONFIG_STRING_CELL_TYPE "cell_type"
|
||||||
#define ENB_CONFIG_STRING_ENB_NAME "eNB_name"
|
#define ENB_CONFIG_STRING_ENB_NAME "eNB_name"
|
||||||
#define ENB_CONFIG_STRING_TRACKING_AREA_CODE "tracking_area_code"
|
#define ENB_CONFIG_STRING_TRACKING_AREA_CODE "tracking_area_code"
|
||||||
#define ENB_CONFIG_STRING_MOBILE_COUNTRY_CODE "mobile_country_code"
|
#define ENB_CONFIG_STRING_MOBILE_COUNTRY_CODE_OLD "mobile_country_code"
|
||||||
#define ENB_CONFIG_STRING_MOBILE_NETWORK_CODE "mobile_network_code"
|
#define ENB_CONFIG_STRING_MOBILE_NETWORK_CODE_OLD "mobile_network_code"
|
||||||
#define ENB_CONFIG_STRING_TRANSPORT_S_PREFERENCE "tr_s_preference"
|
#define ENB_CONFIG_STRING_TRANSPORT_S_PREFERENCE "tr_s_preference"
|
||||||
#define ENB_CONFIG_STRING_LOCAL_S_IF_NAME "local_s_if_name"
|
#define ENB_CONFIG_STRING_LOCAL_S_IF_NAME "local_s_if_name"
|
||||||
#define ENB_CONFIG_STRING_LOCAL_S_ADDRESS "local_s_address"
|
#define ENB_CONFIG_STRING_LOCAL_S_ADDRESS "local_s_address"
|
||||||
@@ -204,9 +204,9 @@ typedef enum {
|
|||||||
{ENB_CONFIG_STRING_ENB_ID, NULL, 0, uptr:NULL, defintval:0, TYPE_UINT, 0}, \
|
{ENB_CONFIG_STRING_ENB_ID, NULL, 0, uptr:NULL, defintval:0, TYPE_UINT, 0}, \
|
||||||
{ENB_CONFIG_STRING_CELL_TYPE, NULL, 0, strptr:NULL, defstrval:"CELL_MACRO_ENB", TYPE_STRING, 0}, \
|
{ENB_CONFIG_STRING_CELL_TYPE, NULL, 0, strptr:NULL, defstrval:"CELL_MACRO_ENB", TYPE_STRING, 0}, \
|
||||||
{ENB_CONFIG_STRING_ENB_NAME, NULL, 0, strptr:NULL, defstrval:"OAIeNodeB", TYPE_STRING, 0}, \
|
{ENB_CONFIG_STRING_ENB_NAME, NULL, 0, strptr:NULL, defstrval:"OAIeNodeB", TYPE_STRING, 0}, \
|
||||||
{ENB_CONFIG_STRING_TRACKING_AREA_CODE, NULL, 0, strptr:NULL, defstrval:"0", TYPE_STRING, 0}, \
|
{ENB_CONFIG_STRING_TRACKING_AREA_CODE, NULL, 0, uptr:NULL, defuintval:0, TYPE_UINT, 0}, \
|
||||||
{ENB_CONFIG_STRING_MOBILE_COUNTRY_CODE, NULL, 0, strptr:NULL, defstrval:"0", TYPE_STRING, 0}, \
|
{ENB_CONFIG_STRING_MOBILE_COUNTRY_CODE_OLD, NULL, 0, strptr:NULL, defstrval:NULL, TYPE_STRING, 0}, \
|
||||||
{ENB_CONFIG_STRING_MOBILE_NETWORK_CODE, NULL, 0, strptr:NULL, defstrval:"0", TYPE_STRING, 0}, \
|
{ENB_CONFIG_STRING_MOBILE_NETWORK_CODE_OLD, NULL, 0, strptr:NULL, defstrval:NULL, TYPE_STRING, 0}, \
|
||||||
{ENB_CONFIG_STRING_TRANSPORT_S_PREFERENCE, NULL, 0, strptr:NULL, defstrval:"local_mac", TYPE_STRING, 0}, \
|
{ENB_CONFIG_STRING_TRANSPORT_S_PREFERENCE, NULL, 0, strptr:NULL, defstrval:"local_mac", TYPE_STRING, 0}, \
|
||||||
{ENB_CONFIG_STRING_LOCAL_S_IF_NAME, NULL, 0, strptr:NULL, defstrval:"lo", TYPE_STRING, 0}, \
|
{ENB_CONFIG_STRING_LOCAL_S_IF_NAME, NULL, 0, strptr:NULL, defstrval:"lo", TYPE_STRING, 0}, \
|
||||||
{ENB_CONFIG_STRING_LOCAL_S_ADDRESS, NULL, 0, strptr:NULL, defstrval:"127.0.0.1", TYPE_STRING, 0}, \
|
{ENB_CONFIG_STRING_LOCAL_S_ADDRESS, NULL, 0, strptr:NULL, defstrval:"127.0.0.1", TYPE_STRING, 0}, \
|
||||||
@@ -220,8 +220,8 @@ typedef enum {
|
|||||||
#define ENB_CELL_TYPE_IDX 1
|
#define ENB_CELL_TYPE_IDX 1
|
||||||
#define ENB_ENB_NAME_IDX 2
|
#define ENB_ENB_NAME_IDX 2
|
||||||
#define ENB_TRACKING_AREA_CODE_IDX 3
|
#define ENB_TRACKING_AREA_CODE_IDX 3
|
||||||
#define ENB_MOBILE_COUNTRY_CODE_IDX 4
|
#define ENB_MOBILE_COUNTRY_CODE_IDX_OLD 4
|
||||||
#define ENB_MOBILE_NETWORK_CODE_IDX 5
|
#define ENB_MOBILE_NETWORK_CODE_IDX_OLD 5
|
||||||
#define ENB_TRANSPORT_S_PREFERENCE_IDX 6
|
#define ENB_TRANSPORT_S_PREFERENCE_IDX 6
|
||||||
#define ENB_LOCAL_S_IF_NAME_IDX 7
|
#define ENB_LOCAL_S_IF_NAME_IDX 7
|
||||||
#define ENB_LOCAL_S_ADDRESS_IDX 8
|
#define ENB_LOCAL_S_ADDRESS_IDX 8
|
||||||
@@ -230,9 +230,56 @@ typedef enum {
|
|||||||
#define ENB_REMOTE_S_PORTC_IDX 11
|
#define ENB_REMOTE_S_PORTC_IDX 11
|
||||||
#define ENB_LOCAL_S_PORTD_IDX 12
|
#define ENB_LOCAL_S_PORTD_IDX 12
|
||||||
#define ENB_REMOTE_S_PORTD_IDX 13
|
#define ENB_REMOTE_S_PORTD_IDX 13
|
||||||
|
|
||||||
|
#define TRACKING_AREA_CODE_OKRANGE {0x0001,0xFFFD}
|
||||||
|
#define ENBPARAMS_CHECK { \
|
||||||
|
{ .s5 = { NULL } }, \
|
||||||
|
{ .s5 = { NULL } }, \
|
||||||
|
{ .s5 = { NULL } }, \
|
||||||
|
{ .s2 = { config_check_intrange, TRACKING_AREA_CODE_OKRANGE } },\
|
||||||
|
{ .s5 = { NULL } }, \
|
||||||
|
{ .s5 = { NULL } }, \
|
||||||
|
{ .s5 = { NULL } }, \
|
||||||
|
{ .s5 = { NULL } }, \
|
||||||
|
{ .s5 = { NULL } }, \
|
||||||
|
{ .s5 = { NULL } }, \
|
||||||
|
{ .s5 = { NULL } }, \
|
||||||
|
{ .s5 = { NULL } }, \
|
||||||
|
{ .s5 = { NULL } }, \
|
||||||
|
{ .s5 = { NULL } }, \
|
||||||
|
}
|
||||||
|
|
||||||
/*-------------------------------------------------------------------------------------------------------------------------------------------------*/
|
/*-------------------------------------------------------------------------------------------------------------------------------------------------*/
|
||||||
/*-------------------------------------------------------------------------------------------------------------------------------------------------*/
|
/*-------------------------------------------------------------------------------------------------------------------------------------------------*/
|
||||||
|
|
||||||
|
/* PLMN ID configuration */
|
||||||
|
|
||||||
|
#define ENB_CONFIG_STRING_PLMN_LIST "plmn_list"
|
||||||
|
|
||||||
|
#define ENB_CONFIG_STRING_MOBILE_COUNTRY_CODE "mcc"
|
||||||
|
#define ENB_CONFIG_STRING_MOBILE_NETWORK_CODE "mnc"
|
||||||
|
#define ENB_CONFIG_STRING_MNC_DIGIT_LENGTH "mnc_length"
|
||||||
|
|
||||||
|
#define ENB_MOBILE_COUNTRY_CODE_IDX 0
|
||||||
|
#define ENB_MOBILE_NETWORK_CODE_IDX 1
|
||||||
|
#define ENB_MNC_DIGIT_LENGTH 2
|
||||||
|
|
||||||
|
#define PLMNPARAMS_DESC { \
|
||||||
|
/* optname helpstr paramflags XXXptr def val type numelt */ \
|
||||||
|
{ENB_CONFIG_STRING_MOBILE_COUNTRY_CODE, "mobile country code", 0, uptr:NULL, defuintval:1000, TYPE_UINT, 0}, \
|
||||||
|
{ENB_CONFIG_STRING_MOBILE_NETWORK_CODE, "mobile network code", 0, uptr:NULL, defuintval:1000, TYPE_UINT, 0}, \
|
||||||
|
{ENB_CONFIG_STRING_MNC_DIGIT_LENGTH, "length of the MNC (2 or 3)", 0, uptr:NULL, defuintval:0, TYPE_UINT, 0}, \
|
||||||
|
}
|
||||||
|
|
||||||
|
#define MCC_MNC_OKRANGES {0,999}
|
||||||
|
#define MNC_DIGIT_LENGTH_OKVALUES {2,3}
|
||||||
|
|
||||||
|
#define PLMNPARAMS_CHECK { \
|
||||||
|
{ .s2 = { config_check_intrange, MCC_MNC_OKRANGES } }, \
|
||||||
|
{ .s2 = { config_check_intrange, MCC_MNC_OKRANGES } }, \
|
||||||
|
{ .s1 = { config_check_intval, MNC_DIGIT_LENGTH_OKVALUES, 2 } }, \
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
/* component carries configuration parameters name */
|
/* component carries configuration parameters name */
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user