Loading ttcn3/EtsiLibrary/LibIpv6/LibCommonRfcs/LibIpv6_Interface_Functions.ttcn +138 −12 Original line number Diff line number Diff line Loading @@ -113,7 +113,7 @@ group rfc2460Root_Functions { v_activeIpv6Packet.extHdrList[i].mobileHeader); // update packet payloadLen p_ipv6Packet.ipv6Hdr.payloadLength := fx_payloadLength (p_ipv6Packet); v_activeIpv6Packet.ipv6Hdr.payloadLength := fx_payloadLength (v_activeIpv6Packet); } // Process Tunneled Header else if (ischosen(v_activeIpv6Packet.extHdrList[i].tunneledIpv6)) { Loading Loading @@ -364,7 +364,7 @@ group rfc3775Mipv6_ExtHdrFunctions { // 3) same applies to nonceIndex etc // Process Nonce Indices if (f_isPresentNonceIndices(p_mobileHeader.mobileMessage.bindingUpdateMsg, v_position) == e_success) { if (f_isPresentNonceIndicesInBU(p_mobileHeader.mobileMessage.bindingUpdateMsg, v_position) == e_success) { // Fill Home Nonce Index only when set to c_uInt16Zero if (p_mobileHeader.mobileMessage.bindingUpdateMsg.mobileOptions[v_position].mobileOptNonceIndices.homeNonceIndex == c_uInt16Zero ) { Loading @@ -389,7 +389,7 @@ group rfc3775Mipv6_ExtHdrFunctions { } } // end Process Nonce Indices if (f_isPresentBindingAuthorizationDataOption(p_mobileHeader.mobileMessage.bindingUpdateMsg, v_position) == e_success) { if (f_isPresentBindingAuthorizationDataOptionInBU(p_mobileHeader.mobileMessage.bindingUpdateMsg, v_position) == e_success) { if(vc_mobileSec.mnSimuParams.receivedHomeKeygenToken != c_64ZeroBits and vc_mobileSec.mnSimuParams.receivedCareOfKeygenToken != c_64ZeroBits) { Loading Loading @@ -433,9 +433,86 @@ group rfc3775Mipv6_ExtHdrFunctions { } } } // else if (ischosen(p_mobileHeader.mobileMessage.bindingAck) and (PX_TEST_IPSEC == true)) { //SMU TODO //} else if (ischosen(p_mobileHeader.mobileMessage.bindingAckMsg)) { var UInt8 v_position := 0; //Concept of including bindingAuthentication // specifiy on template level all options // 1) if authenticator == c_20ZeroBytes then value is calculated in f_setMobileHeader // 2) if authenticator != c_20ZeroBytes then no value is calculated in f_setMobileHeader, // because it's assumed that the correct value was set on template level // 3) same applies to nonceIndex etc // Process Nonce Indices if (f_isPresentNonceIndicesInBA(p_mobileHeader.mobileMessage.bindingAckMsg, v_position) == e_success) { // Fill Home Nonce Index only when set to c_uInt16Zero if (p_mobileHeader.mobileMessage.bindingAckMsg.mobileOptions[v_position].mobileOptNonceIndices.homeNonceIndex == c_uInt16Zero ) { if(vc_mobileSec.cnSimuParams.nonceIndex != c_uInt16Zero) { p_mobileHeader.mobileMessage.bindingAckMsg.mobileOptions[v_position].mobileOptNonceIndices.homeNonceIndex := vc_mobileSec.cnSimuParams.nonceIndex; } else { log("f_setMobileHeader: Info: NonceIndices included in Binding Ack, but cnSimuParams.nonceIndex not initialized"); } } // Fill Care-Of Nonce Index only when set to c_uInt16Zero if (p_mobileHeader.mobileMessage.bindingAckMsg.mobileOptions[v_position].mobileOptNonceIndices.careOfNonceIndex == c_uInt16Zero) { if(vc_mobileSec.cnSimuParams.nonceIndex != c_uInt16Zero) { p_mobileHeader.mobileMessage.bindingAckMsg.mobileOptions[v_position].mobileOptNonceIndices.careOfNonceIndex := vc_mobileSec.cnSimuParams.nonceIndex; } else { log("f_setMobileHeader: Info: NonceIndices included in Binding Ack, but cnSimuParams.nonceIndex not initialized"); } } } // end Process Nonce Indices if (f_isPresentBindingAuthorizationDataOptionInBA(p_mobileHeader.mobileMessage.bindingAckMsg, v_position) == e_success) { if(vc_mobileSec.cnSimuParams.homeKeygenToken != c_64ZeroBits and vc_mobileSec.cnSimuParams.careOfKeygenToken != c_64ZeroBits) { // kbm is different if BA is sent for de-registration if (p_mobileHeader.mobileMessage.bindingAckMsg.lifeTime != 0) { vc_mobileSec.cnSimuParams.kbm := fx_mac( e_sha1, c_1ZeroByte, bit2oct(vc_mobileSec.cnSimuParams.homeKeygenToken) & bit2oct(vc_mobileSec.cnSimuParams.careOfKeygenToken)); } else { vc_mobileSec.cnSimuParams.kbm := fx_mac( e_sha1, c_1ZeroByte, bit2oct(vc_mobileSec.cnSimuParams.homeKeygenToken)); } //set Authenticator option with dummy Authenticator p_mobileHeader.mobileMessage.bindingAckMsg.mobileOptions[v_position].mobileBindingAuthorizationData := { mobileOptType := 5, mobileOptLen := 12, authenticator := c_12ZeroBytes} //calculate the mipHeaderLength over the dummy Authenticator //modified by AMB to easily send packets with wrong mobileHdrLen //calc mobileHeaderLen if (p_mobileHeader.headerLen == c_uInt8Zero ) { p_mobileHeader.headerLen := fx_mipHeaderLength(p_mobileHeader) ; } //set Authenticator to omit in order to calc the authenticator p_mobileHeader.mobileMessage.bindingAckMsg.mobileOptions[v_position].mobileBindingAuthorizationData.authenticator := omit; // compute authenticator p_mobileHeader.mobileMessage.bindingAckMsg.mobileOptions[v_position].mobileBindingAuthorizationData.authenticator := fx_mac( e_hmac_sha1_96, vc_mobileSec.cnSimuParams.kbm, p_dstAddr //cnAddr /!\ inverted /!\ & p_srcAddr //careOfaddr /!\ for BA /!\ & fx_mipHdrToOct(p_mobileHeader) ); } else { log("f_setMobileHeader: Error: BindingAuthorizationDataOption included in Binding Ack, but HomeKeygenToken/CareOfKeygenToken not initialized"); return e_error; } } } // calc mobileHeaderLen only when set to c_uInt8Zero if (p_mobileHeader.headerLen == c_uInt8Zero ) { Loading @@ -462,7 +539,7 @@ group rfc3775Mipv6_ExtHdrFunctions { var UInt8 v_position := 0; var octetstring v_computedAuthenticator; if (f_isPresentBindingAuthorizationDataOption(p_mobileHeader.mobileMessage.bindingUpdateMsg, v_position) == e_success) { if (f_isPresentBindingAuthorizationDataOptionInBU(p_mobileHeader.mobileMessage.bindingUpdateMsg, v_position) == e_success) { p_mobileHeader.checksum := c_2ZeroBytes; Loading Loading @@ -506,6 +583,55 @@ group rfc3775Mipv6_ExtHdrFunctions { } //end function f_checkAuthenticator /* * @desc This goes through the BindingAck and * checks if a NonceIndicesOption is present. * @param p_bindingUpdate Binding Update to be treated * @param v_position Position of the NonceIndicesOption in the MobileOptionList * @return execution status */ function f_isPresentNonceIndicesInBA( in BindingAckMsg p_bindingAck, inout UInt8 v_position) runs on LibIpv6Node return FncRetCode { var FncRetCode v_ret := e_error; var UInt8 i; //select ext hdrs that need special calculation for (i:=0; i<sizeof(p_bindingAck.mobileOptions) and (v_ret != e_success); i:=i+1) { if (ischosen(p_bindingAck.mobileOptions[i].mobileOptNonceIndices)) { v_position := i; v_ret := e_success; } } return v_ret; }//end function f_isPresentNonceIndicesInBA /* * @desc This goes through the BindingAck and * checks if a AuthorizationDataOption is present. * @param p_bindingUpdate Binding Update to be treated * @param v_position Position of the AuthorizationDataOption in the MobileOptionList * @return execution status */ function f_isPresentBindingAuthorizationDataOptionInBA( in BindingAckMsg p_bindingAck, inout UInt8 v_position) runs on LibIpv6Node return FncRetCode { var FncRetCode v_ret := e_error; var UInt8 i; //select ext hdrs that need special calculation for (i:=0; i<sizeof(p_bindingAck.mobileOptions) and (v_ret != e_success); i:=i+1) { if (ischosen(p_bindingAck.mobileOptions[i].mobileBindingAuthorizationData)) { v_position := i; v_ret := e_success; } } return v_ret; }//end function f_isPresentBindingAuthorizationDataOptionInBA /* * @desc This goes through the BindingUpdate and * checks if a NonceIndicesOption is present. Loading @@ -513,7 +639,7 @@ group rfc3775Mipv6_ExtHdrFunctions { * @param v_position Position of the NonceIndicesOption in the MobileOptionList * @return execution status */ function f_isPresentNonceIndices( in BindingUpdateMsg p_bindingUpdate, function f_isPresentNonceIndicesInBU( in BindingUpdateMsg p_bindingUpdate, inout UInt8 v_position) runs on LibIpv6Node return FncRetCode { Loading @@ -528,7 +654,7 @@ group rfc3775Mipv6_ExtHdrFunctions { } } return v_ret; }//end function f_isPresentNonceIndices }//end function f_isPresentNonceIndicesInBU /* * @desc This goes through the BindingUpdate and Loading @@ -537,7 +663,7 @@ group rfc3775Mipv6_ExtHdrFunctions { * @param v_position Position of the AuthorizationDataOption in the MobileOptionList * @return execution status */ function f_isPresentBindingAuthorizationDataOption( in BindingUpdateMsg p_bindingUpdate, function f_isPresentBindingAuthorizationDataOptionInBU( in BindingUpdateMsg p_bindingUpdate, inout UInt8 v_position) runs on LibIpv6Node return FncRetCode { Loading @@ -552,7 +678,7 @@ group rfc3775Mipv6_ExtHdrFunctions { } } return v_ret; }//end function f_isPresentBindingAuthorizationDataOption }//end function f_isPresentBindingAuthorizationDataOptionInBU /* * @desc This sends a IPv6 packet with MipExtHdr - Binding Update Loading ttcn3/EtsiLibrary/LibIpv6/LibMobility/LibIpv6_Rfc3775Mipv6_Functions.ttcn +62 −0 Original line number Diff line number Diff line Loading @@ -2270,6 +2270,37 @@ group mobileSecurityFns { log(" **** a_cnReceiveBindingUpdateAndReplyOffHome: ERROR: Authenticator mismatch ****"); v_ret := e_error; } // send BA if requested if(c_aFlag1 == v_ipv6Packet.extHdrList[1].mobileHeader.mobileMessage.bindingUpdateMsg.aFlag) { //Get SeqNr v_seqNr := v_ipv6Packet.extHdrList[1].mobileHeader.mobileMessage.bindingUpdateMsg.sequenceNumber; //Get Lifetime v_lifetime := v_ipv6Packet.extHdrList[1].mobileHeader.mobileMessage.bindingUpdateMsg.lifeTime; //GetHomeAddress v_mnHomeAddr := v_ipv6Packet.extHdrList[0].destinationOptionHeader.destOptionList[1].homeAddressOption.homeAddress; v_ret := f_sendBA ( m_bindingAck ( c_routeHdr, p_paramsCn.gla, p_paramsIut.mnCoa, m_extHdrList_2Elem ( m_extHdr_routingHeader ( c_mobileHdr, c_routeHdrLen2, c_routeHdrType2, c_routeHdrSegmentsLeft1, m_routingHeaderData_homeAddress(v_mnHomeAddr)), m_extHdr_mobileHeader ( c_noNextHdr, c_bindingAck, m_bindingAckMsg( v_seqNr, v_lifetime, m_mobileOptList_1Elem ( m_mobileOpt_padN(m_optPad4))))))); } } //2nd alternative: m_optPad4 Loading Loading @@ -2313,6 +2344,37 @@ group mobileSecurityFns { log(" **** a_cnReceiveBindingUpdateAndReplyOffHome: ERROR: Authenticator mismatch ****"); v_ret := e_error; } // send BA if requested if(c_aFlag1 == v_ipv6Packet.extHdrList[1].mobileHeader.mobileMessage.bindingUpdateMsg.aFlag) { //Get SeqNr v_seqNr := v_ipv6Packet.extHdrList[1].mobileHeader.mobileMessage.bindingUpdateMsg.sequenceNumber; //Get Lifetime v_lifetime := v_ipv6Packet.extHdrList[1].mobileHeader.mobileMessage.bindingUpdateMsg.lifeTime; //GetHomeAddress v_mnHomeAddr := v_ipv6Packet.extHdrList[0].destinationOptionHeader.destOptionList[1].homeAddressOption.homeAddress; v_ret := f_sendBA ( m_bindingAck ( c_routeHdr, p_paramsCn.gla, p_paramsIut.mnCoa, m_extHdrList_2Elem ( m_extHdr_routingHeader ( c_mobileHdr, c_routeHdrLen2, c_routeHdrType2, c_routeHdrSegmentsLeft1, m_routingHeaderData_homeAddress(v_mnHomeAddr)), m_extHdr_mobileHeader ( c_noNextHdr, c_bindingAck, m_bindingAckMsg( v_seqNr, v_lifetime, m_mobileOptList_1Elem ( m_mobileOpt_padN(m_optPad4))))))); } } }//end a_cnReceiveBindingUpdateAndReplyOffHome Loading Loading
ttcn3/EtsiLibrary/LibIpv6/LibCommonRfcs/LibIpv6_Interface_Functions.ttcn +138 −12 Original line number Diff line number Diff line Loading @@ -113,7 +113,7 @@ group rfc2460Root_Functions { v_activeIpv6Packet.extHdrList[i].mobileHeader); // update packet payloadLen p_ipv6Packet.ipv6Hdr.payloadLength := fx_payloadLength (p_ipv6Packet); v_activeIpv6Packet.ipv6Hdr.payloadLength := fx_payloadLength (v_activeIpv6Packet); } // Process Tunneled Header else if (ischosen(v_activeIpv6Packet.extHdrList[i].tunneledIpv6)) { Loading Loading @@ -364,7 +364,7 @@ group rfc3775Mipv6_ExtHdrFunctions { // 3) same applies to nonceIndex etc // Process Nonce Indices if (f_isPresentNonceIndices(p_mobileHeader.mobileMessage.bindingUpdateMsg, v_position) == e_success) { if (f_isPresentNonceIndicesInBU(p_mobileHeader.mobileMessage.bindingUpdateMsg, v_position) == e_success) { // Fill Home Nonce Index only when set to c_uInt16Zero if (p_mobileHeader.mobileMessage.bindingUpdateMsg.mobileOptions[v_position].mobileOptNonceIndices.homeNonceIndex == c_uInt16Zero ) { Loading @@ -389,7 +389,7 @@ group rfc3775Mipv6_ExtHdrFunctions { } } // end Process Nonce Indices if (f_isPresentBindingAuthorizationDataOption(p_mobileHeader.mobileMessage.bindingUpdateMsg, v_position) == e_success) { if (f_isPresentBindingAuthorizationDataOptionInBU(p_mobileHeader.mobileMessage.bindingUpdateMsg, v_position) == e_success) { if(vc_mobileSec.mnSimuParams.receivedHomeKeygenToken != c_64ZeroBits and vc_mobileSec.mnSimuParams.receivedCareOfKeygenToken != c_64ZeroBits) { Loading Loading @@ -433,9 +433,86 @@ group rfc3775Mipv6_ExtHdrFunctions { } } } // else if (ischosen(p_mobileHeader.mobileMessage.bindingAck) and (PX_TEST_IPSEC == true)) { //SMU TODO //} else if (ischosen(p_mobileHeader.mobileMessage.bindingAckMsg)) { var UInt8 v_position := 0; //Concept of including bindingAuthentication // specifiy on template level all options // 1) if authenticator == c_20ZeroBytes then value is calculated in f_setMobileHeader // 2) if authenticator != c_20ZeroBytes then no value is calculated in f_setMobileHeader, // because it's assumed that the correct value was set on template level // 3) same applies to nonceIndex etc // Process Nonce Indices if (f_isPresentNonceIndicesInBA(p_mobileHeader.mobileMessage.bindingAckMsg, v_position) == e_success) { // Fill Home Nonce Index only when set to c_uInt16Zero if (p_mobileHeader.mobileMessage.bindingAckMsg.mobileOptions[v_position].mobileOptNonceIndices.homeNonceIndex == c_uInt16Zero ) { if(vc_mobileSec.cnSimuParams.nonceIndex != c_uInt16Zero) { p_mobileHeader.mobileMessage.bindingAckMsg.mobileOptions[v_position].mobileOptNonceIndices.homeNonceIndex := vc_mobileSec.cnSimuParams.nonceIndex; } else { log("f_setMobileHeader: Info: NonceIndices included in Binding Ack, but cnSimuParams.nonceIndex not initialized"); } } // Fill Care-Of Nonce Index only when set to c_uInt16Zero if (p_mobileHeader.mobileMessage.bindingAckMsg.mobileOptions[v_position].mobileOptNonceIndices.careOfNonceIndex == c_uInt16Zero) { if(vc_mobileSec.cnSimuParams.nonceIndex != c_uInt16Zero) { p_mobileHeader.mobileMessage.bindingAckMsg.mobileOptions[v_position].mobileOptNonceIndices.careOfNonceIndex := vc_mobileSec.cnSimuParams.nonceIndex; } else { log("f_setMobileHeader: Info: NonceIndices included in Binding Ack, but cnSimuParams.nonceIndex not initialized"); } } } // end Process Nonce Indices if (f_isPresentBindingAuthorizationDataOptionInBA(p_mobileHeader.mobileMessage.bindingAckMsg, v_position) == e_success) { if(vc_mobileSec.cnSimuParams.homeKeygenToken != c_64ZeroBits and vc_mobileSec.cnSimuParams.careOfKeygenToken != c_64ZeroBits) { // kbm is different if BA is sent for de-registration if (p_mobileHeader.mobileMessage.bindingAckMsg.lifeTime != 0) { vc_mobileSec.cnSimuParams.kbm := fx_mac( e_sha1, c_1ZeroByte, bit2oct(vc_mobileSec.cnSimuParams.homeKeygenToken) & bit2oct(vc_mobileSec.cnSimuParams.careOfKeygenToken)); } else { vc_mobileSec.cnSimuParams.kbm := fx_mac( e_sha1, c_1ZeroByte, bit2oct(vc_mobileSec.cnSimuParams.homeKeygenToken)); } //set Authenticator option with dummy Authenticator p_mobileHeader.mobileMessage.bindingAckMsg.mobileOptions[v_position].mobileBindingAuthorizationData := { mobileOptType := 5, mobileOptLen := 12, authenticator := c_12ZeroBytes} //calculate the mipHeaderLength over the dummy Authenticator //modified by AMB to easily send packets with wrong mobileHdrLen //calc mobileHeaderLen if (p_mobileHeader.headerLen == c_uInt8Zero ) { p_mobileHeader.headerLen := fx_mipHeaderLength(p_mobileHeader) ; } //set Authenticator to omit in order to calc the authenticator p_mobileHeader.mobileMessage.bindingAckMsg.mobileOptions[v_position].mobileBindingAuthorizationData.authenticator := omit; // compute authenticator p_mobileHeader.mobileMessage.bindingAckMsg.mobileOptions[v_position].mobileBindingAuthorizationData.authenticator := fx_mac( e_hmac_sha1_96, vc_mobileSec.cnSimuParams.kbm, p_dstAddr //cnAddr /!\ inverted /!\ & p_srcAddr //careOfaddr /!\ for BA /!\ & fx_mipHdrToOct(p_mobileHeader) ); } else { log("f_setMobileHeader: Error: BindingAuthorizationDataOption included in Binding Ack, but HomeKeygenToken/CareOfKeygenToken not initialized"); return e_error; } } } // calc mobileHeaderLen only when set to c_uInt8Zero if (p_mobileHeader.headerLen == c_uInt8Zero ) { Loading @@ -462,7 +539,7 @@ group rfc3775Mipv6_ExtHdrFunctions { var UInt8 v_position := 0; var octetstring v_computedAuthenticator; if (f_isPresentBindingAuthorizationDataOption(p_mobileHeader.mobileMessage.bindingUpdateMsg, v_position) == e_success) { if (f_isPresentBindingAuthorizationDataOptionInBU(p_mobileHeader.mobileMessage.bindingUpdateMsg, v_position) == e_success) { p_mobileHeader.checksum := c_2ZeroBytes; Loading Loading @@ -506,6 +583,55 @@ group rfc3775Mipv6_ExtHdrFunctions { } //end function f_checkAuthenticator /* * @desc This goes through the BindingAck and * checks if a NonceIndicesOption is present. * @param p_bindingUpdate Binding Update to be treated * @param v_position Position of the NonceIndicesOption in the MobileOptionList * @return execution status */ function f_isPresentNonceIndicesInBA( in BindingAckMsg p_bindingAck, inout UInt8 v_position) runs on LibIpv6Node return FncRetCode { var FncRetCode v_ret := e_error; var UInt8 i; //select ext hdrs that need special calculation for (i:=0; i<sizeof(p_bindingAck.mobileOptions) and (v_ret != e_success); i:=i+1) { if (ischosen(p_bindingAck.mobileOptions[i].mobileOptNonceIndices)) { v_position := i; v_ret := e_success; } } return v_ret; }//end function f_isPresentNonceIndicesInBA /* * @desc This goes through the BindingAck and * checks if a AuthorizationDataOption is present. * @param p_bindingUpdate Binding Update to be treated * @param v_position Position of the AuthorizationDataOption in the MobileOptionList * @return execution status */ function f_isPresentBindingAuthorizationDataOptionInBA( in BindingAckMsg p_bindingAck, inout UInt8 v_position) runs on LibIpv6Node return FncRetCode { var FncRetCode v_ret := e_error; var UInt8 i; //select ext hdrs that need special calculation for (i:=0; i<sizeof(p_bindingAck.mobileOptions) and (v_ret != e_success); i:=i+1) { if (ischosen(p_bindingAck.mobileOptions[i].mobileBindingAuthorizationData)) { v_position := i; v_ret := e_success; } } return v_ret; }//end function f_isPresentBindingAuthorizationDataOptionInBA /* * @desc This goes through the BindingUpdate and * checks if a NonceIndicesOption is present. Loading @@ -513,7 +639,7 @@ group rfc3775Mipv6_ExtHdrFunctions { * @param v_position Position of the NonceIndicesOption in the MobileOptionList * @return execution status */ function f_isPresentNonceIndices( in BindingUpdateMsg p_bindingUpdate, function f_isPresentNonceIndicesInBU( in BindingUpdateMsg p_bindingUpdate, inout UInt8 v_position) runs on LibIpv6Node return FncRetCode { Loading @@ -528,7 +654,7 @@ group rfc3775Mipv6_ExtHdrFunctions { } } return v_ret; }//end function f_isPresentNonceIndices }//end function f_isPresentNonceIndicesInBU /* * @desc This goes through the BindingUpdate and Loading @@ -537,7 +663,7 @@ group rfc3775Mipv6_ExtHdrFunctions { * @param v_position Position of the AuthorizationDataOption in the MobileOptionList * @return execution status */ function f_isPresentBindingAuthorizationDataOption( in BindingUpdateMsg p_bindingUpdate, function f_isPresentBindingAuthorizationDataOptionInBU( in BindingUpdateMsg p_bindingUpdate, inout UInt8 v_position) runs on LibIpv6Node return FncRetCode { Loading @@ -552,7 +678,7 @@ group rfc3775Mipv6_ExtHdrFunctions { } } return v_ret; }//end function f_isPresentBindingAuthorizationDataOption }//end function f_isPresentBindingAuthorizationDataOptionInBU /* * @desc This sends a IPv6 packet with MipExtHdr - Binding Update Loading
ttcn3/EtsiLibrary/LibIpv6/LibMobility/LibIpv6_Rfc3775Mipv6_Functions.ttcn +62 −0 Original line number Diff line number Diff line Loading @@ -2270,6 +2270,37 @@ group mobileSecurityFns { log(" **** a_cnReceiveBindingUpdateAndReplyOffHome: ERROR: Authenticator mismatch ****"); v_ret := e_error; } // send BA if requested if(c_aFlag1 == v_ipv6Packet.extHdrList[1].mobileHeader.mobileMessage.bindingUpdateMsg.aFlag) { //Get SeqNr v_seqNr := v_ipv6Packet.extHdrList[1].mobileHeader.mobileMessage.bindingUpdateMsg.sequenceNumber; //Get Lifetime v_lifetime := v_ipv6Packet.extHdrList[1].mobileHeader.mobileMessage.bindingUpdateMsg.lifeTime; //GetHomeAddress v_mnHomeAddr := v_ipv6Packet.extHdrList[0].destinationOptionHeader.destOptionList[1].homeAddressOption.homeAddress; v_ret := f_sendBA ( m_bindingAck ( c_routeHdr, p_paramsCn.gla, p_paramsIut.mnCoa, m_extHdrList_2Elem ( m_extHdr_routingHeader ( c_mobileHdr, c_routeHdrLen2, c_routeHdrType2, c_routeHdrSegmentsLeft1, m_routingHeaderData_homeAddress(v_mnHomeAddr)), m_extHdr_mobileHeader ( c_noNextHdr, c_bindingAck, m_bindingAckMsg( v_seqNr, v_lifetime, m_mobileOptList_1Elem ( m_mobileOpt_padN(m_optPad4))))))); } } //2nd alternative: m_optPad4 Loading Loading @@ -2313,6 +2344,37 @@ group mobileSecurityFns { log(" **** a_cnReceiveBindingUpdateAndReplyOffHome: ERROR: Authenticator mismatch ****"); v_ret := e_error; } // send BA if requested if(c_aFlag1 == v_ipv6Packet.extHdrList[1].mobileHeader.mobileMessage.bindingUpdateMsg.aFlag) { //Get SeqNr v_seqNr := v_ipv6Packet.extHdrList[1].mobileHeader.mobileMessage.bindingUpdateMsg.sequenceNumber; //Get Lifetime v_lifetime := v_ipv6Packet.extHdrList[1].mobileHeader.mobileMessage.bindingUpdateMsg.lifeTime; //GetHomeAddress v_mnHomeAddr := v_ipv6Packet.extHdrList[0].destinationOptionHeader.destOptionList[1].homeAddressOption.homeAddress; v_ret := f_sendBA ( m_bindingAck ( c_routeHdr, p_paramsCn.gla, p_paramsIut.mnCoa, m_extHdrList_2Elem ( m_extHdr_routingHeader ( c_mobileHdr, c_routeHdrLen2, c_routeHdrType2, c_routeHdrSegmentsLeft1, m_routingHeaderData_homeAddress(v_mnHomeAddr)), m_extHdr_mobileHeader ( c_noNextHdr, c_bindingAck, m_bindingAckMsg( v_seqNr, v_lifetime, m_mobileOptList_1Elem ( m_mobileOpt_padN(m_optPad4))))))); } } }//end a_cnReceiveBindingUpdateAndReplyOffHome Loading