func (pdu *V2CPDU) encodePDU(bs []byte, is_dump bool) ([]byte, SnmpError) { internal := newNativePdu() C.snmp_pdu_init(internal) defer func() { C.snmp_pdu_free(internal) releaseNativePdu(internal) }() internal.error_status = C.int32_t(pdu.error_status) if SNMP_PDU_GETBULK == pdu.op { if pdu.variableBindings.Len() < pdu.non_repeaters { internal.error_status = C.int32_t(pdu.variableBindings.Len()) } else { internal.error_status = C.int32_t(pdu.non_repeaters) } if pdu.max_repetitions > 0 { internal.error_index = C.int32_t(pdu.max_repetitions) } else { internal.error_index = C.int32_t(1) } } err := strcpy(&internal.community[0], MAX_COMMUNITY_LEN, pdu.community) if nil != err { return nil, newError(SNMP_CODE_FAILED, err, "copy community") } internal.engine.max_msg_size = C.int32_t(pdu.maxMsgSize) internal.request_id = C.int32_t(pdu.requestId) internal.pdu_type = C.u_int(pdu.op) internal.version = uint32(pdu.version) err = encodeBindings(internal, pdu.GetVariableBindings()) if nil != err { return nil, newError(SNMP_CODE_FAILED, err, "encode bindings") } if is_test { debug_init_secparams(internal) } else { C.snmp_pdu_init_secparams(internal) } if is_dump { C.snmp_pdu_dump(internal) } return encodeNativePdu(bs, internal) }
func (pdu *V3PDU) encodePDU(bs []byte, is_dump bool) ([]byte, SnmpError) { internal := newNativePdu() C.snmp_pdu_init(internal) defer func() { C.snmp_pdu_free(internal) releaseNativePdu(internal) }() internal.request_id = C.int32_t(pdu.requestId) internal.pdu_type = C.u_int(pdu.op) internal.version = uint32(SNMP_V3) internal.error_status = C.int32_t(pdu.error_status) if SNMP_PDU_GETBULK == pdu.op { if pdu.variableBindings.Len() < pdu.non_repeaters { internal.error_status = C.int32_t(pdu.variableBindings.Len()) } else { internal.error_status = C.int32_t(pdu.non_repeaters) } if pdu.max_repetitions > 0 { internal.error_index = C.int32_t(pdu.max_repetitions) } else { internal.error_index = C.int32_t(1) } } if pdu.identifier < 0 { internal.identifier = C.int32_t(pdu.requestId) } else { internal.identifier = C.int32_t(pdu.identifier) } internal.flags = 0 if nil == pdu.contextEngine { internal.context_engine_len = C.uint32_t(0) } else { err := memcpy(&internal.context_engine[0], SNMP_ENGINE_ID_LEN, pdu.contextEngine) if nil != err { return nil, context_engine_failed //newError(SNMP_CODE_FAILED, err, "copy context_engine failed") } internal.context_engine_len = C.uint32_t(len(pdu.contextEngine)) } err := strcpy(&internal.context_name[0], SNMP_CONTEXT_NAME_LEN, pdu.contextName) if nil != err { return nil, context_name_failed //newError(SNMP_CODE_FAILED, err, "copy context_name failed") } if nil != pdu.engine { err = memcpy(&internal.engine.engine_id[0], SNMP_ENGINE_ID_LEN, pdu.engine.engine_id) if nil != err { return nil, engine_id_failed //newError(SNMP_CODE_FAILED, err, "copy engine_id failed") } internal.engine.engine_len = C.uint32_t(len(pdu.engine.engine_id)) internal.engine.engine_boots = C.int32_t(pdu.engine.engine_boots) internal.engine.engine_time = C.int32_t(pdu.engine.engine_time) } if 0 == pdu.maxMsgSize { pdu.maxMsgSize = *maxPDUSize } internal.engine.max_msg_size = C.int32_t(pdu.maxMsgSize) internal.security_model = SNMP_SECMODEL_USM if nil == pdu.securityModel { return nil, security_model_is_nil //newError(SNMP_CODE_FAILED, nil, "security model is nil") } err = pdu.securityModel.Write(&internal.user) if nil != err { return nil, newError(SNMP_CODE_FAILED, err, "fill security model failed") } err = encodeBindings(internal, pdu.GetVariableBindings()) if nil != err { return nil, newError(SNMP_CODE_FAILED, err, "fill encode bindings failed") } if is_test { debug_init_secparams(internal) } else { C.snmp_pdu_init_secparams(internal) } if is_dump { C.snmp_pdu_dump(internal) } return encodeNativePdu(bs, internal) }