#include <snmp/snmp.h>short build_pdu(PDU pdu_ptr);
void free_pdu(PDU pdu_ptr);
PDU make_pdu(short type, long request_id, long error_status, long error_index, OID enterprise, OctetString agent_addr, long generic_trap, long specific_trap, long time_ticks);
PDU parse_pdu(AuthHeader auth_ptr);
free_pdu frees all memory associated with a the PDU header data structure, including the actual packlet and all VarBind structures that were linked to the PDU.
make_pdu is called to create the initial header block for building the SNMP ASN.1 data structure, which upon completion is used to build the actual SNMP packet. make_pdu returns a pointer to a malloc'ed data structure of type PDU:
typedef struct _Pdu { OctetString packlet; / compiled SNMP packet filled by build_pdu / short type; / PDU type / union { NormPdu normpdu; / holds values for non-TRAP_TYPE PDUs / TrapPdu trappdu; / holds values for TRAP_TYPE PDUs / } u; VarBind var_bind_list; / pointer to linked list of var_binds / VarBind var_bind_end_ptr; / pointer to end of linked list / } Pdu;The type is one of GET_REQUEST_TYPE, GET_NEXT_REQUEST_TYPE, GET_RESPONSE_TYPE, SET_REQUEST_TYPE, or TRAP_TYPE. The request_id is the identification number assigned to the particular packet by the application. Since the application is UDP based, retry is controlled solely by the network management application. The error_status is set to other than 0 only for GET_RESPONSE_TYPE, indicating that this response is in reply to a bad request. The error_index is used only by GET_RESPONSE_TYPE and points to the VarBind entry in the PDU that offends the agent. The enterprise is used by TRAP_TYPE PDUs and is an object identifier associated with the entity generating the trap. The agent_addr is used by the TRAP_TYPE PDU and consists of an octet string containing the IP address of the entity generating the trap. The generic_trap and specific_trap are used by the TRAP_TYPE PDU and consist of integers that indicate which type of trap this PDU represents. The time_ticks is the TRAP_TYPE emitting entity's sense of time since the agent has restarted.
This routine is called once for each packet to be generated. The PDU pointer is then passed repeatedly to the routine link_varbind to string the VarBinds into the packet. build_pdu is then called to perform the ASN.1 encoding of the PDU and place the result in the PDU pointer's packlet field. After the packlet has been wrapped in an authentication envelope, it is freed by passing the pointer to free_pdu.
parse_pdu takes a PDU from fully populated AuthHeader structure and parses the information into the library's internal PDU format, including all VarBind instances. This routine is usually called with the authentication header pointer returned by parse_authentication, which is the same state as the header pointer after build_authentication is called. The PDU pointer returned from this call is the same state as the PDU pointer on a building phase after build_pdu has been called. If this routine fails, it returns a NULL.