Project

General

Profile

Feature #4128

Add support of Huawei hNodeB protocol

Added by copslock 4 months ago.

Status:
New
Priority:
Low
Assignee:
-
Target version:
-
Start date:
07/24/2019
Due date:
% Done:

0%

Spec Reference:

Description

Hello developers,the osmo-HNBGW works great with the 3GPP standard femtocells which implemented the HNBAP&RUA protocol,thank you very much,but as Welte said it's somehow dfficult to find some not "lock-down" hNodeB devices,such devices like the ip.access nano3g s8 is really hard to get one even not care about the price nowadays,but the Huawei's old brother ePico3801B variant is somehow easy to get one from some online platform with pretty reasonable price.

I know you guys may not want to waste time on some proprietary blobs that even hard to get one in Europe,but after some reverse-engineering work and according to datasheet from Huawei,it showed that the RUA was replaced with SPUA,and the HNBAP was replaced with APM protocol.And it seems likes Huawei used the commercial NodeB source code and add some sccp-proxy to convert the standard SCCP signaling into SPUA protocol which possible actually implemented the RUA protocol(rua.c source file compiled),and the structure of SPUA signaling is somehow similar with the RUA signaling types,but the APM protocol is completely different compare to the simple HNBAP protocol.
All in all,it will be pretty nice to support these protocols,if anyone need some hardware to analyse,i can send one for free,:)

The SPUA proxy calls
[Sccppry_SpuaPDUType]: Invalid Msg type ucMsgClass = %u
[Sccppry_InitTemplate]: gpSpuaConnReq is Null Ptr\r\n
[Sccppry_InitTemplate]: gpSpuaConnConf is Null Ptr \r\n
[Sccppry_InitTemplate]: gpSpuaDisConnReq is Null Ptr \r\n
[Sccppry_InitTemplate]: gpSpuaData is Null Ptr \r\n
[Sccppry_InitTemplate]: gpSpuaSsnState is Null Ptr \r\n
[Sccppry_InitTemplate]: gpSpuaResCheckReq is Null Ptr \r\n
[Sccppry_InitTemplate]: gpSpuaResRelReq is Null Ptr \r\n
[Sccppry_InitTemplate]: gpSpuaUnitData is Null Ptr \r\n
[Sccppry_HandleSpuaMsg]ulAssocId %u, usStream:%u, ulSlNum:%u, recieve %u bytes data.\n
[Sccppry_HandleSpuaMsg]: ucMSGType = %u\r\n
[Sccppry_HandleSpuaMsg]: Bad MsgType = %u\r\n
[Sccppry_HandleSpuaMsg]: Err Code = %u \r\n
[Sccppry_SpuaLnkUpInd]: SctpApiSend Fail ulRet = %u \r\n
[Sccppry_SpuaLnkUpAck]: SPUA Msg Len = %u. \r\n
[Sccppry_SpuaLnkUpAck]: ucMsgType = %u, usProMsgLen = %u, usMsgLen = %u. \r\n
[Sccppry_SpuaLnkUpAck]: ucDlgReason = %u. \r\n
[Sccppry_SpuaLnkUpAck]: ulApId = %u. \r\n
[Sccppry_SpuaLnkUpAck]: ucLnkAdmission = %u. \r\n
[Sccppry_SpuaLnkUpAck]: SPUA_IE_TIME :%u-%u-%u
[Sccppry_SpuaLnkUpAck]: OmSetCurrentTime Fail, ulRslt = %u \r\n
[Sccppry_SpuaLnkUpAck]: SctpApiShutdown Fail, ulRet = %u \r\n
[Sccppry_SpuaLnkUpAck]: Update Eiu State Fail, ulRet = %u , Connect to next AG.\r\n
[Sccppry_SpuaLnkUpAck]: AG Auth: %u(1:Yes, 0:No), AP Auth: %u(1:Yes, 0:No). \r\n
[Sccppry_SpuaLnkUpAck]: Update Eiu State Fail, ulRet = %u, Needn't Auth. \r\n
[Sccppry_SpuaSIGStateInd]: SPUA Msg Len = %u\r\n
[Sccppry_SpuaSIGStateInd]: ucMsgType = %u, usProMsgLen = %u, usMsgLen = %u\r\n
[Sccppry_SpuaSIGStateInd]: ucSigpointStatus = %u\r\n
[Sccppry_SpuaSIGStateInd]: ulSigPoint = %u\r\n
[Sccppry_SpuaSSNStateConf]: Sctp Send data Fail, ulRet =\r\n
[Sccppry_SpuaSSNStateInd]: SPUA Msg Len = %u\r\n
[Sccppry_SpuaSSNStateInd]: ucMsgType = %u, usProMsgLen = %u, usMsgLen = %u\r\n
[Sccppry_SpuaResCheckReq]: ucAffectedSubsystem = %u\r\n
[Sccppry_SpuaResCheckReq]: ucEnStatus = %u\r\n
[Sccppry_SpuaSSNStateTest]: SPUA Msg Len = %u\r\n
[Sccppry_SpuaSSNStateTest]: ucMsgType = %u, usProMsgLen = %u, usMsgLen = %u\r\n
[Sccppry_SpuaResCheckReq]: ucAffectedSSN = %u\r\n
[Sccppry_SpuaResCheckReq]: ulAffectedSigPoint = %u\r\n
[Sccppry_SpuaResCheckReq]: SPUA Msg Len = %u\r\n
[Sccppry_SpuaResCheckReq]: ucMsgType = %u, usProMsgLen = %u, usMsgLen = %u\r\n
[Sccppry_SpuaResCheckReq]: ulMappingConnectId = %u\r\n
[Sccppry_SpuaResCheckReq]: ulUserConnectId = %u\r\n
[Sccppry_SpuaResRelReq]: SPUA Msg Len = %u\r\n
[Sccppry_SpuaResRelReq]: ucMsgType = %u, usProMsgLen = %u, usMsgLen = %u\r\n
[Sccppry_SpuaUnitDataTrans]: ulUserConnectId = %u\r\n
[Sccppry_SpuaUnitDataTrans]: SPUA Msg Len = %u\r\n
[Sccppry_SpuaUnitDataTrans]: ucMsgType = %u, usProMsgLen = %u, usMsgLen = %u\r\n
[Sccppry_SpuaUnitDataTrans]: ucReturnReason = %u\r\n
[Sccppry_SpuaUnitDataTrans]: ucSequenceCtrl = %u\r\n
[Sccppry_SpuaUnitDataTrans]: ucImportance = %u\r\n
[Sccppry_SpuaUnitDataTrans]: usDataLen = %u\r\n
[Sccppry_SpuaNoticeInd]: In Sccppry_SpuaNoticeInd\r\n
[Sccppry_SpuaConnectReq]: SPUA Msg Len = %u\r\n
[Sccppry_SpuaConnectReq]: ucMsgType = %u, usProMsgLen = %u, usMsgLen = %u\r\n
[Sccppry_SpuaConnectReq]: ulMappingConnectId = %u\r\n
[Sccppry_SpuaConnectReq]: ucProtocalType = %u\r\n
[Sccppry_SpuaConnectReq]: ulWindowSize = %u\r\n
[Sccppry_SpuaConnectReq]: ucExp = %u\r\n
[Sccppry_SpuaConnectReq]: ucImportance = %u\r\n
[Sccppry_SpuaConnectReq]: usDataLen = %u\r\n
\\[Sccppry_SpuaConnectConf]: SPUA Msg Len = %u\r\n
[Sccppry_SpuaConnectConf]: ucMsgType = %u, usProMsgLen = %u, usMsgLen = %u\r\n
[Sccppry_SpuaConnectConf]: ulMappingConnectId = %u\r\n
[Sccppry_SpuaConnectConf]: ulUserConnectId = %u\r\n
[Sccppry_SpuaConnectConf]: ucProtocalType = %u\r\n
[Sccppry_SpuaConnectConf]: ulWindowSize = %u\r\n
[Sccppry_SpuaConnectConf]: ucExp = %u\r\n
[Sccppry_SpuaConnectConf]: ucImportance = %u\r\n
[Sccppry_SpuaConnectConf]: usDataLen = %u\r\n
[Sccppry_SpuaDisConnectReq]: SPUA Msg Len = %u\r\n
[Sccppry_SpuaDisConnectReq]: ucMsgType = %u, usProMsgLen = %u, usMsgLen = %u\r\n
[Sccppry_SpuaDisConnectReq]: ulUserConnectId = %u\r\n
[Sccppry_SpuaDisConnectReq]: ucOriginator = %u\r\n
[Sccppry_SpuaDisConnectReq]: ucReason = %u\r\n
[Sccppry_SpuaDisConnectReq]: ucImportance = %u\r\n
[Sccppry_SpuaDisConnectReq]: usDataLen = %u\r\n
[Sccppry_SpuaDataTransfer]: SPUA Msg Len = %u\r\n
[Sccppry_SpuaDataTransfer]: ucMsgType = %u, usProMsgLen = %u, usMsgLen = %u\r\n
[Sccppry_SpuaDataTransfer]: ulUserConnectId = %u\r\n
[Sccppry_SpuaDataTransfer]: ucImportance = %u\r\n
[Sccppry_SpuaDataTransfer]: usDataLen = %u\r\n
[Sccppry_SpuaUdpMulCapInd]: SctpApiSend Fail ulRet = %u \r\n
[Sccppry_SpuaUdpMulCapInd]: Start ghtMulFunIndTimer Fail \r\n
[Sccppry_SpuaUdpMulCapAck]: Stop ghtMulFunIndTimer Fail \r\n
[Sccppry_SpuaUdpMulCapAck]: ucMsgType = %u, usProMsgLen = %u, usMsgLen = %u\r\n
[Sccppry_SpuaUdpMulCapAck]: ucIsEnable = %u\r\n
[Sccppry_SpuaUdpMulCapAck]: usReceiveUdpPort = %u\r\n
[Sccppry_SpuaUdpMulCapAck]: Len(%u),ucIsEnable(%u),usReceiveUdpPort(%u),msgtype(%u)\r\n

Possible the APM calls
D:\\\\CI_Views\\\\p_ePico3801V200R011C01_Main\\\\UMTS_AP_Code\\\\UAP3801\\\\CPU/app/src/rr/asn1/apm/Asn1ApmDecode.c
Error detected in DecodeUnsupport function :ASN1_APM_DecodeUmtsNeighbCellList_Unsupported
Decode Error In usCnt(APM_MAX_NO_UMTS_NEIGHBCELL_LST_PTL).\r\nBad Value: %u = usCnt.,and Modify it to the ProductValue
Error detected in DecodeUnsupport function :ASN1_APM_DecodeGsmNeighbCellList_Unsupported
Decode Error In usCnt(APM_MAX_NO_GSM_NEIGHBCELL_LST_PTL).\r\nBad Value: %u = usCnt.,and Modify it to the ProductValue
Decode Error In OctString:ulApmIpaddr.
Error detected in DecodeUnsupport function :ASN1_APM_DecodeAgBoardList_Unsupported
Decode Error In usCnt(APM_MAX_NO_AGBD_LST_PTL).\r\nBad Value: %u = usCnt.,and Modify it to the ProductValue
Error detected in DecodeUnsupport function :ASN1_APM_DecodeAgList_Unsupported
Decode Error In usCnt(APM_MAX_NO_AG_LST_PTL).\r\nBad Value: %u = usCnt.,and Modify it to the ProductValue
Error detected in DecodeUnsupport function :ASN1_APM_DecodeHuaweiipclkList_Unsupported
Decode Error In usCnt(APM_MAX_NO_HUAWEIIPCLK_LST_PTL).\r\nBad Value: %u = usCnt.,and Modify it to the ProductValue
Error detected in DecodeUnsupport function :ASN1_APM_DecodeIeee1588ClkMasterTable_Unsupported
Decode Error In usCnt(APM_MAX_LEN_IEEE1588CLKMASTBL_PTL).\r\nBad Value: %u = usCnt.,and Modify it to the ProductValue
Error detected in DecodeUnsupport function :ASN1_APM_DecodeSgwServerList_Unsupported
Decode Error In usCnt(APM_MAX_NO_SGWSVR_LST_PTL).\r\nBad Value: %u = usCnt.,and Modify it to the ProductValue
Error detected in DecodeUnsupport function :ASN1_APM_DecodeSgwPathList_Unsupported
Decode Error In usCnt(APM_MAX_NO_OF_SGW_PATH_LST_PTL).\r\nBad Value: %u = usCnt.,and Modify it to the ProductValue
Error detected in DecodeUnsupport function :ASN1_APM_DecodeSgwNwList_Unsupported
Decode Error In usCnt(APM_MAX_NO_OF_SGW_NETWORK_LST_PTL).\r\nBad Value: %u = usCnt.,and Modify it to the ProductValue
ApmInfo.
Error detected in DecodeUnsupport function :ASN1_APM_DecodeUePermissionList_Unsupported
Decode Error In usCnt(APM_MAX_NO_UEPERMISSION_LST_PTL).\r\nBad Value: %u = usCnt.,and Modify it to the ProductValue
Error detected in DecodeUnsupport function :ASN1_APM_DecodeGaPolygon_Unsupported
Decode Error In usCnt(APM_MAX_NO_OF_POINT).\r\nBad Value: %u = usCnt.,and Modify it to the ProductValue
Error detected in DecodeUnsupport function :ASN1_APM_DecodeGiUeList_Unsupported
Decode Error In usCnt(APM_MAX_NO_GI_UE_LST_PTL).\r\nBad Value: %u = usCnt.,and Modify it to the ProductValue
Error detected in DecodeUnsupport function :ASN1_APM_DecodePacketBasedRuleList_Unsupported
Decode Error In usCnt(APM_MAX_NO_PACKET_BASED_RULE_LST_PTL).\r\nBad Value: %u = usCnt.,and Modify it to the ProductValue
Error detected in DecodeUnsupport function :ASN1_APM_DecodeApnBasedRuleList_Unsupported
Decode Error In usCnt(APM_MAX_NO_APN_BASED_RULE_LST_PTL).\r\nBad Value: %u = usCnt.,and Modify it to the ProductValue
Error detected in DecodeUnsupport function :ASN1_APM_DecodeDomainBasedRuleList_Unsupported
Decode Error In usCnt(APM_MAX_NO_DOMAIN_BASED_RULE_LST_PTL).\r\nBad Value: %u = usCnt.,and Modify it to the ProductValue
Error detected in DecodeUnsupport function :ASN1_APM_DecodeUeOffloadRuleList_Unsupported
Decode Error In usCnt(APM_MAX_NO_UE_OFFLOAD_RULE_LST_PTL).\r\nBad Value: %u = usCnt.,and Modify it to the ProductValue
Error detected in DecodeUnsupport function :ASN1_APM_DecodeLicenseArithmeticList_Unsupported
Decode Error In usCnt(APM_MAX_NO_OF_LICENSE_ARITHMETIC_LIST_PTL).\r\nBad Value: %u = usCnt.,and Modify it to the ProductValue
EapMd5Info In PDU of IeId:id_EAP_MD5Info\r\n
D:\\\\CI_Views\\\\p_ePico3801V200R011C01_Main\\\\UMTS_AP_Code\\\\UAP3801\\\\CPU/app/src/rr/asn1/apm/Asn1ApmEncode.c
Encode Error In ASN1_APM_EncodeUmtsNeighbCellList
Encode Error In ASN1_APM_EncodeGsmNeighbCellList
Detect the Encode Error in Encoding APM_AP_BOOT_REQ_STRU ;\n
Error in ASN1_APM_EncodeApId\n
Error in ASN1_APM_EncodeLocInfo\n
Warning the Extension container --- APM_AP_BOOT_REQ_STRU have no PDU .Check input.;\n
Detect the Encode Error in Encoding APM_PROTCL_EXT_AP_BOOT_REQ_STRU ;\n
Warning the Extension container --- APM_PROTCL_EXT_AP_BOOT_REQ_STRU have no PDU .Check input.;\n
APM_AP_BOOT_REQ_STRU.;\n
APM_PROTCL_EXT_AP_BOOT_REQ_STRU.;\n
Encode Error In OctString:ulApmIpaddr.
Encode Error In ASN1_APM_EncodeAgBoardList
Encode Error In ASN1_APM_EncodeAgList
Encode Error In ASN1_APM_EncodeHuaweiipclkList
Encode Error In ASN1_APM_EncodeIeee1588ClkMasterTable
Detect the Encode Error in Encoding APM_IE_EXT_SGW_SERVER_STRU ;\n
Warning the Extension container --- APM_IE_EXT_SGW_SERVER_STRU have no PDU .Check input.;\n
APM_IE_EXT_SGW_SERVER_STRU.;\n
Encode Error In ASN1_APM_EncodeSgwServerList
Encode Error In ASN1_APM_EncodeSgwPathList
Encode Error In ASN1_APM_EncodeSgwNwList
Detect the Encode Error in Encoding APM_IE_EXT_SGW_INFO_STRU ;\n
Error in ASN1_APM_EncodeSgwNwList\n
Warning the Extension container --- APM_IE_EXT_SGW_INFO_STRU have no PDU .Check input.;\n
APM_IE_EXT_SGW_INFO_STRU.;\n
ApmInfo.
Detect the Encode Error in Encoding APM_AP_BOOT_RSP_STRU ;\n
Error in ASN1_APM_EncodeApContext\n
Warning the Extension container --- APM_AP_BOOT_RSP_STRU have no PDU .Check input.;\n
APM_AP_BOOT_RSP_STRU.;\n
Detect the Encode Error in Encoding APM_IE_EXT_AP_RADIO_INFO_STRU ;\n
Warning the Extension container --- APM_IE_EXT_AP_RADIO_INFO_STRU have no PDU .Check input.;\n
APM_IE_EXT_AP_RADIO_INFO_STRU.;\n
Detect the Encode Error in Encoding APM_AP_PARA_UPT_IND_STRU ;\n
Error in ASN1_APM_EncodeApRadioInfo\n
Warning the Extension container --- APM_AP_PARA_UPT_IND_STRU have no PDU .Check input.;\n
APM_AP_PARA_UPT_IND_STRU.;\n
Encode Error In ASN1_APM_EncodeUePermissionList
Detect the Encode Error in Encoding APM_IE_EXT_AP_PERMISSION_LIST_STRU ;\n
Warning the Extension container --- APM_IE_EXT_AP_PERMISSION_LIST_STRU have no PDU .Check input.;\n
APM_IE_EXT_AP_PERMISSION_LIST_STRU.;\n
Detect the Encode Error in Encoding APM_IE_EXT_LOC_IND_STRU ;\n
Error in ASN1_APM_EncodeAudioToneInsertion\n
Warning the Extension container --- APM_IE_EXT_LOC_IND_STRU have no PDU .Check input.;\n
APM_IE_EXT_LOC_IND_STRU.;\n
Encode Error In ASN1_APM_EncodeGaPolygon
Encode Error In ASN1_APM_EncodeGiUeList
Encode Error In ASN1_APM_EncodePacketBasedRuleList
Encode Error In ASN1_APM_EncodeApnBasedRuleList
Encode Error In ASN1_APM_EncodeDomainBasedRuleList
Encode Error In ASN1_APM_EncodeUeOffloadRuleList
Detect the Encode Error in Encoding APM_IE_EXT_AP_INFO_SYNC_STRU ;\n
Error in ASN1_APM_EncodeLicenseInfo\n
Error in ASN1_APM_EncodeLicenseArithmetic\n
Error in ASN1_APM_EncodeApGiInfo\n
Warning the Extension container --- APM_IE_EXT_AP_INFO_SYNC_STRU have no PDU .Check input.;\n
APM_IE_EXT_AP_INFO_SYNC_STRU.;\n
Detect the Encode Error in Encoding APM_AP_PARA_SYNC_REQ_STRU ;\n
Error in ASN1_APM_EncodeApInfoSync\n
Warning the Extension container --- APM_AP_PARA_SYNC_REQ_STRU have no PDU .Check input.;\n
APM_AP_PARA_SYNC_REQ_STRU.;\n
Detect the Encode Error in Encoding APM_AP_PARA_SYNC_RSP_STRU ;\n
Warning the Extension container --- APM_AP_PARA_SYNC_RSP_STRU have no PDU .Check input.;\n
APM_AP_PARA_SYNC_RSP_STRU.;\n
Detect the Encode Error in Encoding APM_AP_ACCESS_REQ_STRU ;\n
Warning the Extension container --- APM_AP_ACCESS_REQ_STRU have no PDU .Check input.;\n
Encode Error In ASN1_APM_EncodeLicenseArithmeticList
Detect the Encode Error in Encoding APM_PROTCL_EXT_AP_ACCESS_REQ_STRU ;\n
Error in ASN1_APM_EncodeLicenseArithmeticList\n
Warning the Extension container --- APM_PROTCL_EXT_AP_ACCESS_REQ_STRU have no PDU .Check input.;\n
APM_AP_ACCESS_REQ_STRU.;\n
APM_PROTCL_EXT_AP_ACCESS_REQ_STRU.;\n
Detect the Encode Error in Encoding APM_IE_EXT_PERMISSION_LIST_STRU ;\n
Warning the Extension container --- APM_IE_EXT_PERMISSION_LIST_STRU have no PDU .Check input.;\n
APM_IE_EXT_PERMISSION_LIST_STRU.;\n
Detect the Encode Error in Encoding APM_IE_EXT_AP_ACCESS_INFO_STRU ;\n
Error in ASN1_APM_EncodeEapMd5Info\n
Warning the Extension container --- APM_IE_EXT_AP_ACCESS_INFO_STRU have no PDU .Check input.;\n
APM_IE_EXT_AP_ACCESS_INFO_STRU.;\n
Detect the Encode Error in Encoding APM_AP_ACCESS_RSP_STRU ;\n
Error in ASN1_APM_EncodeTime\n
Error in ASN1_APM_EncodeApAccessInfo\n
Warning the Extension container --- APM_AP_ACCESS_RSP_STRU have no PDU .Check input.;\n
APM_AP_ACCESS_RSP_STRU.;\n
Detect the Encode Error in Encoding APM_AP_PARA_MODIFY_IND_STRU ;\n
Warning the Extension container --- APM_AP_PARA_MODIFY_IND_STRU have no PDU .Check input.;\n
APM_AP_PARA_MODIFY_IND_STRU.;\n
Detect the Encode Error in Encoding APM_AP_PARA_MODIFY_CONF_STRU ;\n
Warning the Extension container --- APM_AP_PARA_MODIFY_CONF_STRU have no PDU .Check input.;\n
APM_AP_PARA_MODIFY_CONF_STRU.;\n
Detect the Encode Error in Encoding APM_AP_REBOOT_IND_STRU ;\n
Warning the Extension container --- APM_AP_REBOOT_IND_STRU have no PDU .Check input.;\n
APM_AP_REBOOT_IND_STRU.;\n
Detect the Encode Error in Encoding APM_AP_INQUIRE_IMSI_REQ_STRU ;\n
Warning the Extension container --- APM_AP_INQUIRE_IMSI_REQ_STRU have no PDU .Check input.;\n
APM_AP_INQUIRE_IMSI_REQ_STRU.;\n
Detect the Encode Error in Encoding APM_AP_INQUIRE_IMSI_RSP_STRU ;\n
Warning the Extension container --- APM_AP_INQUIRE_IMSI_RSP_STRU have no PDU .Check input.;\n
APM_AP_INQUIRE_IMSI_RSP_STRU.;\n
Detect the Encode Error in Encoding APM_AP_QOS_DETECT_BEGIN_REQ_STRU ;\n
Warning the Extension container --- APM_AP_QOS_DETECT_BEGIN_REQ_STRU have no PDU .Check input.;\n
APM_AP_QOS_DETECT_BEGIN_REQ_STRU.;\n
Detect the Encode Error in Encoding APM_AP_QOS_DETECT_BEGIN_RSP_STRU ;\n
Warning the Extension container --- APM_AP_QOS_DETECT_BEGIN_RSP_STRU have no PDU .Check input.;\n
APM_AP_QOS_DETECT_BEGIN_RSP_STRU.;\n
Detect the Encode Error in Encoding APM_AP_QOS_DETECT_END_REQ_STRU ;\n
Warning the Extension container --- APM_AP_QOS_DETECT_END_REQ_STRU have no PDU .Check input.;\n
APM_AP_QOS_DETECT_END_REQ_STRU.;\n
Detect the Encode Error in Encoding APM_AP_QOS_DETECT_END_RSP_STRU ;\n
Warning the Extension container --- APM_AP_QOS_DETECT_END_RSP_STRU have no PDU .Check input.;\n
APM_AP_QOS_DETECT_END_RSP_STRU.;\n
Detect the Encode Error in Encoding APM_AP_CFG_TRANSF_STRU ;\n
Error in ASN1_APM_EncodeSonCfgTransf\n
Warning the Extension container --- APM_AP_CFG_TRANSF_STRU have no PDU .Check input.;\n
APM_AP_CFG_TRANSF_STRU.;\n

Also available in: Atom PDF

Add picture from clipboard (Maximum size: 48.8 MB)