getavp



// 【クラス名】  : 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;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值