// 【クラス名】 : DiameterMsgProcess
// 【機能概要】 : avp code(配列)により、avp情報を取得する。
// 【入力】 :I/O: avpInfo[] avp codeの構造体を含める
// I: avpArrLen avp code工数
// I: cpBuf 受信buffer
// I: bufLength 受信buffer長さ
// 【出力】 : 戻り値 処理結果(int)
// D_OK:正常
// D_NG1:異常
// 【制限事項】 : 特になし
int DiameterMsgProcess::getAvp(dia_avp_head_msg_t avpInfo[], uint_t avpArrLen,
char* cpBuf, uint_t bufLength) {
// 入力チェック
if ((cpBuf == NULLP) || (avpInfo == NULLP)) {
DIA_NOTIFY_ERROR(DIAMETER_MSGPROCESS_CN, DIA_ERROR_CODE_MSG_ANALYSE, 0,
0,0,(-1));
// 異常終了
return D_NG1;
}
uint_t findNumber = 0;
uint_t remainLength = DIAMSG_BOUNDARY_ADJUST(bufLength);
// 2017.04.24 JFTT M-MVNO-17A-MSMN-xxxxx Start
// 遍歴cpBuf
while (remainLength > DIACMN_AVP_CHECK_AVPLEN8) { //易错
// buf Code取得
uint_t bufCode;
NET_TO_HOST4(cpBuf, bufCode);
//avp head length取得
uint_t avp_head_len = 0;
char* buf;
buf = cpBuf + DIA_AVP_POS_AVPFLAG;
// V bitチェック
if (0 != (*buf & DIACMN_AVP_HDR_FLG_V)) {
avp_head_len = DIACMN_AVP_CHECK_AVPLEN12;
} else {
avp_head_len = DIACMN_AVP_CHECK_AVPLEN8;
}
// avp data length取得
uint_t avd_data_len = 0;
buf = cpBuf + DIA_AVP_POS_AVPLENGTH;
NET_TO_HOST3(buf, avd_data_len);
if( avd_data_len < avp_head_len || avd_data_len > remainLength ) {
DIA_NOTIFY_ERROR(DIAMETER_MSGPROCESS_CN, DIA_ERROR_CODE_MSG_ANALYSE, 0,
0,0,(-1));
// 異常終了
return D_NG1;
}
// input avpcode チェック
uint_t i = 0;
for (i = 0; i < avpArrLen; i++) {
if (avpInfo[i].avp_data_length == 0 && bufCode == avpInfo[i].avp_code){
findNumber += 1;
// V bit取得
buf = cpBuf + DIA_AVP_POS_AVPFLAG;
if (0 != (*buf & DIACMN_AVP_HDR_FLG_V)) {
avpInfo[i].cV_bit = DIACMN_AVP_CHECK_ON;
buf = cpBuf + DIA_AVP_POS_VENDORID;
NET_TO_HOST4(buf, avpInfo[i].uiVendor_Id);
} else {
avpInfo[i].cV_bit = DIACMN_AVP_CHECK_OFF;
}
// M bit取得
buf = cpBuf + DIA_AVP_POS_AVPFLAG;
if (0 != (*buf & DIACMN_AVP_HDR_FLG_M)) {
avpInfo[i].cM_bit = DIACMN_AVP_CHECK_ON;
} else {
avpInfo[i].cM_bit = DIACMN_AVP_CHECK_OFF;
}
// P bit取得
if (0 != (*buf & DIACMN_AVP_HDR_FLG_P)) {
avpInfo[i].cP_bit = DIACMN_AVP_CHECK_ON;
} else {
avpInfo[i].cP_bit = DIACMN_AVP_CHECK_OFF;
}
// avp data length
avpInfo[i].avp_head_length = avp_head_len;
// 2017.03.24 JFTT M-MVNO-17A-MSMN-00001 Start
// IDR信号受信時にMVNO加入者プロファイル取得にてエラーが発生する。
//*(avpInfo[i].avp_data) = cpBuf + avp_head_len;
avpInfo[i].avp_data_length = avd_data_len - avp_head_len;
avpInfo[i].avp_data = cpBuf + avp_head_len;
// 2017.03.24 JFTT M-MVNO-17A-MSMN-00001 End
break;
} // end if
} // end for
// avpInfo取得終了
if (findNumber == avpArrLen) {
break;
}
remainLength -= DIAMSG_BOUNDARY_ADJUST(avd_data_len);
cpBuf += DIAMSG_BOUNDARY_ADJUST(avd_data_len);
} // end while
// 2017.04.24 JFTT M-MVNO-17A-MSMN-xxxxx End
// 正常終了
return D_OK;
}