From 05d983f73dd83441169a11704e494ab686fece0e Mon Sep 17 00:00:00 2001 From: "naman.gupta" Date: Fri, 19 Nov 2021 14:22:25 +0530 Subject: [PATCH] Added ranfunctionOid for E2APv1.1 service update. Added ranfunction Oid for E2APv1.1 for service update message. Issue-ID: RIC-640 Signed-off-by: naman.gupta Change-Id: I877dcc856502e88304f4521170bda2749c5ba337 --- .../rmrmsghandlers/ric_service_update_handler.go | 114 ++++++++++---------- E2Manager/models/ric_service_update_message.go | 116 +++++++++++---------- .../models/ric_service_update_message_test.go | 13 ++- .../RicServiceUpdate_AddedFunction_With_OID.xml | 114 ++++++++++++++++++++ 4 files changed, 243 insertions(+), 114 deletions(-) create mode 100644 E2Manager/tests/resources/serviceUpdate/RicServiceUpdate_AddedFunction_With_OID.xml diff --git a/E2Manager/handlers/rmrmsghandlers/ric_service_update_handler.go b/E2Manager/handlers/rmrmsghandlers/ric_service_update_handler.go index ccce4a8..2f871e7 100644 --- a/E2Manager/handlers/rmrmsghandlers/ric_service_update_handler.go +++ b/E2Manager/handlers/rmrmsghandlers/ric_service_update_handler.go @@ -20,15 +20,16 @@ package rmrmsghandlers import ( "bytes" - "e2mgr/utils" "e2mgr/logger" "e2mgr/managers" "e2mgr/models" "e2mgr/rmrCgo" "e2mgr/services" "e2mgr/services/rmrsender" + "e2mgr/utils" "encoding/xml" "fmt" + "gerrit.o-ran-sc.org/r/ric-plt/nodeb-rnib.git/common" "gerrit.o-ran-sc.org/r/ric-plt/nodeb-rnib.git/entities" ) @@ -42,26 +43,27 @@ const ( ) type functionDetails struct { - functionChange int - functionId uint32 - functionDefinition string - functionRevision uint32 + functionChange int + functionId uint32 + functionDefinition string + functionRevision uint32 + functionOID string } type RicServiceUpdateHandler struct { - logger *logger.Logger - rmrSender *rmrsender.RmrSender - rNibDataService services.RNibDataService - ranListManager managers.RanListManager + logger *logger.Logger + rmrSender *rmrsender.RmrSender + rNibDataService services.RNibDataService + ranListManager managers.RanListManager } func NewRicServiceUpdateHandler(logger *logger.Logger, rmrSender *rmrsender.RmrSender, rNibDataService services.RNibDataService, ranListManager managers.RanListManager) *RicServiceUpdateHandler { - return &RicServiceUpdateHandler { - logger: logger, - rmrSender: rmrSender, - rNibDataService: rNibDataService, - ranListManager: ranListManager, - } + return &RicServiceUpdateHandler{ + logger: logger, + rmrSender: rmrSender, + rNibDataService: rNibDataService, + ranListManager: ranListManager, + } } func (h *RicServiceUpdateHandler) Handle(request *models.NotificationRequest) { @@ -69,14 +71,14 @@ func (h *RicServiceUpdateHandler) Handle(request *models.NotificationRequest) { h.logger.Infof("#RicServiceUpdateHandler.Handle - RAN name: %s - received RIC_SERVICE_UPDATE. Payload: %s", ranName, request.Payload) nodebInfo, err := h.rNibDataService.GetNodeb(ranName) - if err != nil { - _, ok := err.(*common.ResourceNotFoundError) + if err != nil { + _, ok := err.(*common.ResourceNotFoundError) if !ok { h.logger.Errorf("#RicServiceUpdateHandler.Handle - failed to get nodeB entity for ran name: %v due to RNIB Error: %s", ranName, err) - } else{ - h.logger.Errorf("#RicServiceUpdateHandler.Handle - nobeB entity of RanName:%s absent in RNIB. Error: %s", ranName, err) - } - return + } else { + h.logger.Errorf("#RicServiceUpdateHandler.Handle - nobeB entity of RanName:%s absent in RNIB. Error: %s", ranName, err) + } + return } ricServiceUpdate, err := h.parseSetupRequest(request.Payload) @@ -119,15 +121,15 @@ func (h *RicServiceUpdateHandler) sendUpdateAck(updateAck models.RicServiceUpdat } toReplaceTags := []string{"reject", "ignore", "procedureCode", "id", "RANfunctionID-Item", "RANfunctionsID-List"} - payLoad = utils.ReplaceEmptyTagsWithSelfClosing(payLoad,toReplaceTags) + payLoad = utils.ReplaceEmptyTagsWithSelfClosing(payLoad, toReplaceTags) - h.logger.Infof("#RicServiceUpdate.sendUpdateAck - Sending RIC_SERVICE_UPDATE_ACK to RAN name: %s with payload %s",nodebInfo.RanName, payLoad) + h.logger.Infof("#RicServiceUpdate.sendUpdateAck - Sending RIC_SERVICE_UPDATE_ACK to RAN name: %s with payload %s", nodebInfo.RanName, payLoad) msg := models.NewRmrMessage(rmrCgo.RIC_SERVICE_UPDATE_ACK, nodebInfo.RanName, payLoad, request.TransactionId, request.GetMsgSrc()) err = h.rmrSender.Send(msg) return err } -func (h *RicServiceUpdateHandler) updateFunctions(RICServiceUpdateIEs []models.RICServiceUpdateIEs,nodebInfo *entities.NodebInfo) []models.RicServiceAckRANFunctionIDItem { +func (h *RicServiceUpdateHandler) updateFunctions(RICServiceUpdateIEs []models.RICServiceUpdateIEs, nodebInfo *entities.NodebInfo) []models.RicServiceAckRANFunctionIDItem { ranFunctions := nodebInfo.GetGnb().RanFunctions RanFIdtoIdxMap := make(map[uint32]int) var acceptedFunctionIds []models.RicServiceAckRANFunctionIDItem @@ -144,14 +146,14 @@ func (h *RicServiceUpdateHandler) updateFunctions(RICServiceUpdateIEs []models.R } for _, functionDetail := range functionDetails { - functionChange, functionId, functionDefinition, functionRevision := functionDetail.functionChange, - functionDetail.functionId, functionDetail.functionDefinition, functionDetail.functionRevision + functionChange, functionId, functionDefinition, functionRevision, functionOID := functionDetail.functionChange, + functionDetail.functionId, functionDetail.functionDefinition, functionDetail.functionRevision, functionDetail.functionOID ranFIndex, ok := RanFIdtoIdxMap[functionId] if !ok { switch functionChange { - case RAN_FUNCTIONS_ADDED,RAN_FUNCTIONS_MODIFIED : - ranFunctions = append(ranFunctions, &entities.RanFunction{RanFunctionId:functionId, - RanFunctionDefinition:functionDefinition, RanFunctionRevision:functionRevision}) + case RAN_FUNCTIONS_ADDED, RAN_FUNCTIONS_MODIFIED: + ranFunctions = append(ranFunctions, &entities.RanFunction{RanFunctionId: functionId, + RanFunctionDefinition: functionDefinition, RanFunctionRevision: functionRevision, RanFunctionOid: functionOID}) case RAN_FUNCTIONS_DELETED: //Do nothing } @@ -164,7 +166,7 @@ func (h *RicServiceUpdateHandler) updateFunctions(RICServiceUpdateIEs []models.R functionsToBeDeleted[ranFIndex] = true } } - serviceupdateAckFunctionId := models.RicServiceAckRANFunctionIDItem{RanFunctionID:functionId, RanFunctionRevision:functionRevision} + serviceupdateAckFunctionId := models.RicServiceAckRANFunctionIDItem{RanFunctionID: functionId, RanFunctionRevision: functionRevision} acceptedFunctionIds = append(acceptedFunctionIds, serviceupdateAckFunctionId) } } @@ -187,36 +189,36 @@ func (h *RicServiceUpdateHandler) remove(ranFunctions []*entities.RanFunction, f return finalranFunctions } -func (h *RicServiceUpdateHandler) getFunctionDetails(ricServiceUpdateIE models.RICServiceUpdateIEs) ([]functionDetails , error) { +func (h *RicServiceUpdateHandler) getFunctionDetails(ricServiceUpdateIE models.RICServiceUpdateIEs) ([]functionDetails, error) { functionChange := ricServiceUpdateIE.ID - switch functionChange{ - case RAN_FUNCTIONS_ADDED, RAN_FUNCTIONS_MODIFIED: - return h.getFunctionsAddedModifiedHandler(ricServiceUpdateIE) - case RAN_FUNCTIONS_DELETED: - return h.getFunctionsDeleteHandler(ricServiceUpdateIE) - default: - return nil, common.NewInternalError(fmt.Errorf("#RicServiceUpdate.getFunctionDetails - Unknown change type %v", functionChange)) + switch functionChange { + case RAN_FUNCTIONS_ADDED, RAN_FUNCTIONS_MODIFIED: + return h.getFunctionsAddedModifiedHandler(ricServiceUpdateIE) + case RAN_FUNCTIONS_DELETED: + return h.getFunctionsDeleteHandler(ricServiceUpdateIE) + default: + return nil, common.NewInternalError(fmt.Errorf("#RicServiceUpdate.getFunctionDetails - Unknown change type %v", functionChange)) } return nil, common.NewInternalError(fmt.Errorf("#RicServiceUpdate.getFunctionDetails - Internal Error")) } -func (h *RicServiceUpdateHandler) getFunctionsAddedModifiedHandler(ricServiceUpdateIE models.RICServiceUpdateIEs) ([]functionDetails , error){ +func (h *RicServiceUpdateHandler) getFunctionsAddedModifiedHandler(ricServiceUpdateIE models.RICServiceUpdateIEs) ([]functionDetails, error) { functionChange := ricServiceUpdateIE.ID ranFunctionsIEList := ricServiceUpdateIE.Value.RANfunctionsList.RANfunctionsItemProtocolIESingleContainer - if len(ranFunctionsIEList) ==0 { + if len(ranFunctionsIEList) == 0 { return nil, common.NewInternalError(fmt.Errorf("#RicServiceUpdate.getFunctionDetails - function change type is %v but Functions list is empty", functionChange)) } functionDetailsList := make([]functionDetails, len(ranFunctionsIEList)) for index, ranFunctionIE := range ranFunctionsIEList { ranFunction := ranFunctionIE.Value.RANfunctionItem - functionDetailsList[index] = functionDetails{functionChange:functionChange, functionId:ranFunction.RanFunctionID, - functionDefinition:ranFunction.RanFunctionDefinition, functionRevision:ranFunction.RanFunctionRevision} + functionDetailsList[index] = functionDetails{functionChange: functionChange, functionId: ranFunction.RanFunctionID, + functionDefinition: ranFunction.RanFunctionDefinition, functionRevision: ranFunction.RanFunctionRevision, functionOID: ranFunction.RanFunctionOID} } return functionDetailsList, nil } -func (h *RicServiceUpdateHandler) getFunctionsDeleteHandler(ricServiceUpdateIE models.RICServiceUpdateIEs) ([]functionDetails , error){ +func (h *RicServiceUpdateHandler) getFunctionsDeleteHandler(ricServiceUpdateIE models.RICServiceUpdateIEs) ([]functionDetails, error) { functionChange := ricServiceUpdateIE.ID ranFunctionIdIEsList := ricServiceUpdateIE.Value.RANfunctionsIDList.RANfunctionsItemIDProtocolIESingleContainer if len(ranFunctionIdIEsList) == 0 { @@ -226,22 +228,22 @@ func (h *RicServiceUpdateHandler) getFunctionsDeleteHandler(ricServiceUpdateIE m functionDetailsList := make([]functionDetails, len(ranFunctionIdIEsList)) for index, ranFunctionIdIE := range ranFunctionIdIEsList { ranFunctionId := ranFunctionIdIE.Value.RANfunctionIDItem - functionDetailsList[index] = functionDetails{functionChange:functionChange, functionId:ranFunctionId.RanFunctionID, - functionDefinition:"", functionRevision:ranFunctionId.RanFunctionRevision} + functionDetailsList[index] = functionDetails{functionChange: functionChange, functionId: ranFunctionId.RanFunctionID, + functionDefinition: "", functionRevision: ranFunctionId.RanFunctionRevision} } return functionDetailsList, nil } func (h *RicServiceUpdateHandler) parseSetupRequest(payload []byte) (*models.RICServiceUpdateMessage, error) { - pipInd := bytes.IndexByte(payload, '|') - if pipInd < 0 { - return nil, common.NewInternalError(fmt.Errorf("#RicServiceUpdateHandler.parseSetupRequest - Error parsing RIC SERVICE UPDATE failed extract Payload: no | separator found")) - } - - ricServiceUpdate := &models.RICServiceUpdateMessage{} - err := xml.Unmarshal(utils.NormalizeXml(payload[pipInd+1:]), &ricServiceUpdate.E2APPDU) - if err != nil { - return nil, common.NewInternalError(fmt.Errorf("#RicServiceUpdateHandler.parseSetupRequest - Error unmarshalling RIC SERVICE UPDATE payload: %x", payload)) - } - return ricServiceUpdate, nil + pipInd := bytes.IndexByte(payload, '|') + if pipInd < 0 { + return nil, common.NewInternalError(fmt.Errorf("#RicServiceUpdateHandler.parseSetupRequest - Error parsing RIC SERVICE UPDATE failed extract Payload: no | separator found")) + } + + ricServiceUpdate := &models.RICServiceUpdateMessage{} + err := xml.Unmarshal(utils.NormalizeXml(payload[pipInd+1:]), &ricServiceUpdate.E2APPDU) + if err != nil { + return nil, common.NewInternalError(fmt.Errorf("#RicServiceUpdateHandler.parseSetupRequest - Error unmarshalling RIC SERVICE UPDATE payload: %x", payload)) + } + return ricServiceUpdate, nil } diff --git a/E2Manager/models/ric_service_update_message.go b/E2Manager/models/ric_service_update_message.go index 4fcbe0d..0ffe458 100644 --- a/E2Manager/models/ric_service_update_message.go +++ b/E2Manager/models/ric_service_update_message.go @@ -20,94 +20,95 @@ package models import ( "encoding/xml" + "gerrit.o-ran-sc.org/r/ric-plt/nodeb-rnib.git/entities" ) type RANfunctionsItemProtocolIESingleContainer struct { - Text string `xml:",chardata"` - Id string `xml:"id"` - Criticality struct { - Text string `xml:",chardata"` - Ignore string `xml:"ignore"` - } `xml:"criticality"` - Value struct { - Text string `xml:",chardata"` - RANfunctionItem struct { - Text string `xml:",chardata"` - RanFunctionID uint32 `xml:"ranFunctionID"` - RanFunctionDefinition string `xml:"ranFunctionDefinition"` - RanFunctionRevision uint32 `xml:"ranFunctionRevision"` - } `xml:"RANfunction-Item"` - } `xml:"value"` + Text string `xml:",chardata"` + Id string `xml:"id"` + Criticality struct { + Text string `xml:",chardata"` + Ignore string `xml:"ignore"` + } `xml:"criticality"` + Value struct { + Text string `xml:",chardata"` + RANfunctionItem struct { + Text string `xml:",chardata"` + RanFunctionID uint32 `xml:"ranFunctionID"` + RanFunctionDefinition string `xml:"ranFunctionDefinition"` + RanFunctionRevision uint32 `xml:"ranFunctionRevision"` + RanFunctionOID string `xml:"ranFunctionOID"` + } `xml:"RANfunction-Item"` + } `xml:"value"` } type RANfunctionsItemIDProtocolIESingleContainer struct { - Text string `xml:",chardata"` - Id string `xml:"id"` - Criticality struct { - Text string `xml:",chardata"` - Ignore string `xml:"ignore"` - } `xml:"criticality"` - Value struct { - Text string `xml:",chardata"` - RANfunctionIDItem struct { - Text string `xml:",chardata"` - RanFunctionID uint32 `xml:"ranFunctionID"` - RanFunctionRevision uint32 `xml:"ranFunctionRevision"` - } `xml:"RANfunctionID-Item"` - } `xml:"value"` + Text string `xml:",chardata"` + Id string `xml:"id"` + Criticality struct { + Text string `xml:",chardata"` + Ignore string `xml:"ignore"` + } `xml:"criticality"` + Value struct { + Text string `xml:",chardata"` + RANfunctionIDItem struct { + Text string `xml:",chardata"` + RanFunctionID uint32 `xml:"ranFunctionID"` + RanFunctionRevision uint32 `xml:"ranFunctionRevision"` + } `xml:"RANfunctionID-Item"` + } `xml:"value"` } - type RICServiceUpdateIEs struct { Text string `xml:",chardata"` - ID int `xml:"id"` - Criticality struct { - Text string `xml:",chardata"` - Reject string `xml:"reject"` - } `xml:"criticality"` - Value struct { + ID int `xml:"id"` + Criticality struct { Text string `xml:",chardata"` + Reject string `xml:"reject"` + } `xml:"criticality"` + Value struct { + Text string `xml:",chardata"` RANfunctionsList struct { - Text string `xml:",chardata"` + Text string `xml:",chardata"` RANfunctionsItemProtocolIESingleContainer []RANfunctionsItemProtocolIESingleContainer `xml:"ProtocolIE-SingleContainer"` } `xml:"RANfunctions-List"` RANfunctionsIDList struct { - Text string `xml:",chardata"` + Text string `xml:",chardata"` RANfunctionsItemIDProtocolIESingleContainer []RANfunctionsItemIDProtocolIESingleContainer `xml:"ProtocolIE-SingleContainer"` } `xml:"RANfunctionsID-List"` - }`xml:"value"` + } `xml:"value"` } type RICServiceUpdateInitiatingMessage struct { - Text string `xml:",chardata"` - ProcedureCode string `xml:"procedureCode"` - Criticality struct { - Text string `xml:",chardata"` - Reject string `xml:"reject"` - } `xml:"criticality"` + Text string `xml:",chardata"` + ProcedureCode string `xml:"procedureCode"` + Criticality struct { + Text string `xml:",chardata"` + Reject string `xml:"reject"` + } `xml:"criticality"` Value struct { - Text string `xml:",chardata"` + Text string `xml:",chardata"` RICServiceUpdate struct { Text string `xml:",chardata"` - ProtocolIEs struct { - Text string `xml:",chardata"` - RICServiceUpdateIEs []RICServiceUpdateIEs `xml:"RICserviceUpdate-IEs"` - } `xml:"protocolIEs"` + ProtocolIEs struct { + Text string `xml:",chardata"` + RICServiceUpdateIEs []RICServiceUpdateIEs `xml:"RICserviceUpdate-IEs"` + } `xml:"protocolIEs"` } `xml:"RICserviceUpdate"` } `xml:"value"` } type RICServiceUpdateE2APPDU struct { - XMLName xml.Name `xml:"E2AP-PDU"` - Text string `xml:",chardata"` - InitiatingMessage RICServiceUpdateInitiatingMessage `xml:"initiatingMessage"` + XMLName xml.Name `xml:"E2AP-PDU"` + Text string `xml:",chardata"` + InitiatingMessage RICServiceUpdateInitiatingMessage `xml:"initiatingMessage"` } -type RICServiceUpdateMessage struct{ - XMLName xml.Name `xml:"RICserviceUpdateMessage"` - Text string `xml:",chardata"` - E2APPDU RICServiceUpdateE2APPDU `xml:"E2AP-PDU"` +type RICServiceUpdateMessage struct { + XMLName xml.Name `xml:"RICserviceUpdateMessage"` + Text string `xml:",chardata"` + E2APPDU RICServiceUpdateE2APPDU `xml:"E2AP-PDU"` } func (m *RICServiceUpdateE2APPDU) ExtractRanFunctionsList() []*entities.RanFunction { @@ -125,6 +126,7 @@ func (m *RICServiceUpdateE2APPDU) ExtractRanFunctionsList() []*entities.RanFunct RanFunctionId: ranFunctionItem.RanFunctionID, RanFunctionDefinition: ranFunctionItem.RanFunctionDefinition, RanFunctionRevision: ranFunctionItem.RanFunctionRevision, + RanFunctionOid: ranFunctionItem.RanFunctionOID, } } return funcs diff --git a/E2Manager/models/ric_service_update_message_test.go b/E2Manager/models/ric_service_update_message_test.go index c9ea390..3edff8a 100644 --- a/E2Manager/models/ric_service_update_message_test.go +++ b/E2Manager/models/ric_service_update_message_test.go @@ -23,8 +23,9 @@ import ( "e2mgr/models" "e2mgr/utils" "encoding/xml" - "github.com/stretchr/testify/assert" "testing" + + "github.com/stretchr/testify/assert" ) func getTestRicServiceUpdate(t *testing.T, xmlPath string) *models.RICServiceUpdateMessage { @@ -47,3 +48,13 @@ func TestRicServiceUpdateMessageNoRanFunctions(t *testing.T) { serviceUpdate := getTestRicServiceUpdate(t, "../tests/resources/serviceUpdate/RicServiceUpdate_Empty.xml") assert.Nil(t, serviceUpdate.E2APPDU.ExtractRanFunctionsList()) } + +func TestRicServiceUpdateMessageWithOID(t *testing.T) { + serviceUpdate := getTestRicServiceUpdate(t, "../tests/resources/serviceUpdate/RicServiceUpdate_AddedFunction_With_OID.xml") + + ranFunctions := serviceUpdate.E2APPDU.ExtractRanFunctionsList() + + assert.Equal(t, uint32(20), ranFunctions[0].RanFunctionId) + assert.Equal(t, uint32(2), ranFunctions[0].RanFunctionRevision) + assert.Equal(t, "OID20", ranFunctions[0].RanFunctionOid) +} diff --git a/E2Manager/tests/resources/serviceUpdate/RicServiceUpdate_AddedFunction_With_OID.xml b/E2Manager/tests/resources/serviceUpdate/RicServiceUpdate_AddedFunction_With_OID.xml new file mode 100644 index 0000000..319b681 --- /dev/null +++ b/E2Manager/tests/resources/serviceUpdate/RicServiceUpdate_AddedFunction_With_OID.xml @@ -0,0 +1,114 @@ + + + 7 + + + + + + 10 + + + + + 8 + + + + 18 + OID18 + + 20 63 6F 6E 6E 65 63 74 65 64 20 64 65 70 6C 6F + 20 6D 6F 6E 69 74 6F 72 01 01 60 00 01 01 07 00 + 50 65 72 69 6F 64 69 63 20 72 65 70 6F 72 74 01 + 05 14 01 01 1D 00 4F 2D 44 55 20 4D 65 61 73 75 + 72 65 6D 65 6E 74 20 43 6F 6E 74 61 69 6E 65 72 + 20 66 6F 72 20 74 68 65 20 35 47 43 20 63 6F 6E + 6E 65 63 74 65 64 20 64 65 70 6C 6F 79 6D 65 6E + 74 01 01 01 01 00 01 02 1D 00 4F 2D 44 55 20 4D + 65 61 73 75 72 65 6D 65 6E 74 20 43 6F 6E 74 61 + 69 6E 65 72 20 66 6F 72 20 74 68 65 20 45 50 43 + 20 63 6F 6E 6E 65 63 74 65 64 20 64 65 70 6C 6F + 79 6D 65 6E 74 01 01 01 01 00 01 03 1E 80 4F 2D + 43 55 2D 43 50 20 4D 65 61 73 75 72 65 6D 65 6E + 74 20 43 6F 6E 74 61 69 6E 65 72 20 66 6F 72 20 + 74 68 65 20 35 47 43 20 63 6F 6E 6E 65 63 74 65 + 64 20 64 65 70 6C 6F 79 6D 65 6E 74 01 01 01 01 + 00 01 04 1E 80 4F 2D 43 55 2D 43 50 20 4D 65 61 + 73 75 72 65 6D 65 6E 74 20 43 6F 6E 74 61 69 6E + 65 72 20 66 6F 72 20 74 68 65 20 45 50 43 20 63 + 6F 6E 6E 65 63 74 65 64 20 64 65 70 6C 6F 79 6D + 65 6E 74 01 01 01 01 00 01 05 1E 80 4F 2D 43 55 + 2D 55 50 20 4D 65 61 73 75 72 65 6D 65 6E 74 20 + 43 6F 6E 74 61 69 6E 65 72 20 66 6F 72 20 74 68 + 65 20 35 47 43 20 63 6F 6E 6E 65 63 74 65 64 20 + 64 65 70 6C 6F 79 6D 65 6E 74 01 01 01 01 00 01 + 06 1E 80 4F 2D 43 55 2D 55 50 20 4D 65 61 73 75 + 72 65 6D 65 6E 74 20 43 6F 6E 74 61 69 6E 65 72 + 20 66 6F 72 20 74 68 65 20 45 50 43 20 63 6F 6E + 6E 65 63 74 65 64 20 64 65 70 6C 6F 79 6D 65 6E + 74 01 01 01 01 + + 5 + + + + + + + + 10 + + + + + 8 + + + + 20 + OID20 + + 50 65 72 69 6F 64 69 63 20 72 65 70 6F 72 74 01 + 20 6D 6F 6E 69 74 6F 72 01 01 60 00 01 01 07 00 + 50 65 72 69 6F 64 69 63 20 72 65 70 6F 72 74 01 + 05 14 01 01 1D 00 4F 2D 44 55 20 4D 65 61 73 75 + 72 65 6D 65 6E 74 20 43 6F 6E 74 61 69 6E 65 72 + 20 66 6F 72 20 74 68 65 20 35 47 43 20 63 6F 6E + 6E 65 63 74 65 64 20 64 65 70 6C 6F 79 6D 65 6E + 74 01 01 01 01 00 01 02 1D 00 4F 2D 44 55 20 4D + 65 61 73 75 72 65 6D 65 6E 74 20 43 6F 6E 74 61 + 69 6E 65 72 20 66 6F 72 20 74 68 65 20 45 50 43 + 20 63 6F 6E 6E 65 63 74 65 64 20 64 65 70 6C 6F + 79 6D 65 6E 74 01 01 01 01 00 01 03 1E 80 4F 2D + 43 55 2D 43 50 20 4D 65 61 73 75 72 65 6D 65 6E + 74 20 43 6F 6E 74 61 69 6E 65 72 20 66 6F 72 20 + 74 68 65 20 35 47 43 20 63 6F 6E 6E 65 63 74 65 + 64 20 64 65 70 6C 6F 79 6D 65 6E 74 01 01 01 01 + 00 01 04 1E 80 4F 2D 43 55 2D 43 50 20 4D 65 61 + 73 75 72 65 6D 65 6E 74 20 43 6F 6E 74 61 69 6E + 65 72 20 66 6F 72 20 74 68 65 20 45 50 43 20 63 + 6F 6E 6E 65 63 74 65 64 20 64 65 70 6C 6F 79 6D + 65 6E 74 01 01 01 01 00 01 05 1E 80 4F 2D 43 55 + 2D 55 50 20 4D 65 61 73 75 72 65 6D 65 6E 74 20 + 43 6F 6E 74 61 69 6E 65 72 20 66 6F 72 20 74 68 + 65 20 35 47 43 20 63 6F 6E 6E 65 63 74 65 64 20 + 64 65 70 6C 6F 79 6D 65 6E 74 01 01 01 01 00 01 + 06 1E 80 4F 2D 43 55 2D 55 50 20 4D 65 61 73 75 + 72 65 6D 65 6E 74 20 43 6F 6E 74 61 69 6E 65 72 + 20 66 6F 72 20 74 68 65 20 45 50 43 20 63 6F 6E + 65 20 35 47 43 20 63 6F 6E 6E 65 63 74 65 64 20 + 74 01 01 01 01 + + 2 + + + + + + + + + + + -- 2.16.6