Imagine that you need to load test a Network Management System (NMS), which might receive hundreds of SNMP traps every second from tens of thousands of devices on the network. Clearly it is impractical to actually deploy thousands of devices in a test environment, so you need a tool to generate the SNMP traps at the required volume.

A quick search for SNMP load testing tools shows that they are all fairly primitive, with poor support for creating SNMP traps with dynamic field values, and no support for integrated system monitoring. There are definitely no tools with the same level of functionality as LoadRunner.

Unfortunately LoadRunner does not have an SNMP vuser type…but fortunately LoadRunner is endlessly extensible, if you are not afraid to get your hands dirty. Read on for how I created a LoadRunner script to send SNMP traps to an NMS…

The first step was to capture some SNMP traps. This is best done by packet capture on the NMS server. Here is an example SNMP trap, displayed in Wireshark:
SNMP trap displayed in Wireshark

This example SNMP trap is from Cisco Enterprise Policy Manager (CW_LMS_CISCO-EPM-NOTIFICATION-MIB.mib).

The SNMP trap can be dumped out to a less friendly, but more useful format (format is Offest, Hex, Text):

0000   30 82 04 0a 02 01 01 04 06 70 75 62 6c 69 63 a7  0........public.
0010   82 03 fb 02 01 04 02 01 00 02 01 00 30 82 03 ee  ............0...
0020   30 0e 06 08 2b 06 01 02 01 01 03 00 43 02 05 13  0...+.......C...
0030   30 19 06 0a 2b 06 01 06 03 01 01 04 01 00 06 0b  0...+...........
0040   2b 06 01 04 01 09 09 82 37 00 02 30 22 06 0f 2b  +.......7..0"..+
0050   06 01 04 01 09 09 82 37 01 01 02 01 02 01 04 0f  .......7........
0060   63 65 6e 41 6c 61 72 6d 56 65 72 73 69 6f 6e 30  cenAlarmVersion0
0070   16 06 0f 2b 06 01 04 01 09 09 82 37 01 01 02 01  ...+.......7....
0080   03 01 43 03 01 8a 92 30 16 06 0f 2b 06 01 04 01  ..C....0...+....
0090   09 09 82 37 01 01 02 01 04 01 43 03 01 8a 92 30  ...7......C....0
00a0   25 06 0f 2b 06 01 04 01 09 09 82 37 01 01 02 01  %..+.......7....
00b0   05 01 04 12 63 65 6e 41 6c 61 72 6d 49 6e 73 74  ....cenAlarmInst
00c0   61 6e 63 65 49 44 30 14 06 0f 2b 06 01 04 01 09  anceID0...+.....
00d0   09 82 37 01 01 02 01 06 01 02 01 01 30 2b 06 0f  ..7.........0+..
00e0   2b 06 01 04 01 09 09 82 37 01 01 02 01 07 01 04  +.......7.......
00f0   18 63 65 6e 41 6c 61 72 6d 53 74 61 74 75 73 44  .cenAlarmStatusD
0100   65 66 69 6e 69 74 69 6f 6e 30 14 06 0f 2b 06 01  efinition0...+..
0110   04 01 09 09 82 37 01 01 02 01 08 01 02 01 01 30  .....7.........0
0120   14 06 0f 2b 06 01 04 01 09 09 82 37 01 01 02 01  ...+.......7....
0130   09 01 02 01 00 30 2d 06 0f 2b 06 01 04 01 09 09  .....0-..+......
0140   82 37 01 01 02 01 0a 01 04 1a 63 65 6e 41 6c 61  .7........cenAla
0150   72 6d 43 61 74 65 67 6f 72 79 44 65 66 69 6e 69  rmCategoryDefini
0160   74 69 6f 6e 30 14 06 0f 2b 06 01 04 01 09 09 82  tion0...+.......
0170   37 01 01 02 01 0b 01 02 01 00 30 28 06 0f 2b 06  7.........0(..+.
0180   01 04 01 09 09 82 37 01 01 02 01 0c 01 04 15 63  ......7........c
0190   65 6e 41 6c 61 72 6d 53 65 72 76 65 72 41 64 64  enAlarmServerAdd
01a0   72 65 73 73 30 2e 06 0f 2b 06 01 04 01 09 09 82  ress0...+.......
01b0   37 01 01 02 01 0d 01 04 1b 63 65 6e 41 6c 61 72  7........cenAlar
01c0   6d 4d 61 6e 61 67 65 64 4f 62 6a 65 63 74 43 6c  mManagedObjectCl
01d0   61 73 73 31 30 14 06 0f 2b 06 01 04 01 09 09 82  ass10...+.......
01e0   37 01 01 02 01 0e 01 02 01 00 30 21 06 0f 2b 06  7.........0!..+.
01f0   01 04 01 09 09 82 37 01 01 02 01 0f 01 04 0e 31  ......7........1
0200   30 2e 32 33 32 2e 31 38 30 2e 31 30 31 30 46 06  0.232.180.1010F.
0210   0f 2b 06 01 04 01 09 09 82 37 01 01 02 01 10 01  .+.......7......
0220   04 33 58 58 58 3a 43 6f 6d 70 6f 6e 65 6e 74 3d  .3XXX:Component=
0230   43 6f 6d 70 6f 6e 65 6e 74 31 3b 43 6f 6d 70 6f  Component1;Compo
0240   6e 65 6e 74 43 6c 61 73 73 2d 43 43 6c 61 73 73  nentClass-CClass
0250   31 3b 59 59 59 30 14 06 0f 2b 06 01 04 01 09 09  1;YYY0...+......
0260   82 37 01 01 02 01 11 01 02 01 02 30 2d 06 0f 2b  .7.........0-..+
0270   06 01 04 01 09 09 82 37 01 01 02 01 12 01 04 1a  .......7........
0280   63 65 6e 41 6c 61 72 6d 53 65 76 65 72 69 74 79  cenAlarmSeverity
0290   44 65 66 69 6e 69 74 69 6f 6e 30 14 06 0f 2b 06  Definition0...+.
02a0   01 04 01 09 09 82 37 01 01 02 01 13 01 02 01 01  ......7.........
02b0   30 17 06 0f 2b 06 01 04 01 09 09 82 37 01 01 02  0...+.......7...
02c0   01 14 01 04 04 31 30 30 30 30 22 06 0f 2b 06 01  .....10000"..+..
02d0   04 01 09 09 82 37 01 01 02 01 15 01 04 0f 63 65  .....7........ce
02e0   6e 55 73 65 72 4d 65 73 73 61 67 65 31 30 22 06  nUserMessage10".
02f0   0f 2b 06 01 04 01 09 09 82 37 01 01 02 01 16 01  .+.......7......
0300   04 0f 63 65 6e 55 73 65 72 4d 65 73 73 61 67 65  ..cenUserMessage
0310   32 30 22 06 0f 2b 06 01 04 01 09 09 82 37 01 01  20"..+.......7..
0320   02 01 17 01 04 0f 63 65 6e 55 73 65 72 4d 65 73  ......cenUserMes
0330   73 61 67 65 33 30 14 06 0f 2b 06 01 04 01 09 09  sage30...+......
0340   82 37 01 01 02 01 18 01 02 01 02 30 14 06 0f 2b  .7.........0...+
0350   06 01 04 01 09 09 82 37 01 01 02 01 19 01 42 01  .......7......B.
0360   01 30 23 06 0f 2b 06 01 04 01 09 09 82 37 01 01  .0#..+.......7..
0370   02 01 1a 01 04 10 63 65 6e 50 61 72 74 69 74 69  ......cenPartiti
0380   6f 6e 4e 61 6d 65 30 2c 06 0f 2b 06 01 04 01 09  onName0,..+.....
0390   09 82 37 01 01 02 01 1b 01 04 19 63 65 6e 43 75  ..7........cenCu
03a0   73 74 6f 6d 65 72 49 64 65 6e 74 69 66 69 63 61  stomerIdentifica
03b0   74 69 6f 6e 30 26 06 0f 2b 06 01 04 01 09 09 82  tion0&..+.......
03c0   37 01 01 02 01 1c 01 04 13 63 65 6e 43 75 73 74  7........cenCust
03d0   6f 6d 65 72 52 65 76 69 73 69 6f 6e 30 1d 06 0f  omerRevision0...
03e0   2b 06 01 04 01 09 09 82 37 01 01 02 01 1d 01 04  +.......7.......
03f0   0a 63 65 6e 41 6c 65 72 74 49 44 30 11 06 09 2b  .cenAlertID0...+
0400   06 01 06 03 12 01 03 00 40 04 7f 00              ........@...

In theory, we can take the hex values from the above SNMP message, and send the same data using a Windows Sockets vuser.

/*********************************************************************
 * Created by Mercury Interactive Windows Sockets Recorder
 * Author: Stuart Moncrieff (www.myloadtest.com)
 *********************************************************************/
#include "lrs.h"

vuser_init()
{
  lrs_startup(257); // The lrs_startup function initializes the Windows Sockets DLL. It specifies the highest Windows Sockets version that can be used with the application.

  // Note that UDP is "connectionless", so the message will still be sent, even if the IP address does not exist.
  lrs_create_socket("socket0", "UDP", "LocalHost=0", "RemoteHost=10.232.181.31:162",  LrsLastArg);

  return 0;
}

Action()
{
  /* 
  Send an SNMP trap. Note that there will be no response, so there 
  is no lrs_receive(), and there is nothing to verify, so this transaction always passes.
  The transaction has been defined only so that the number of SNMP traps can be counted.
  The data that is sent (buf0) can be found in the data.ws file.
  */

  lr_start_transaction("send_snmp_trap");

  lrs_send("socket0", "buf0", LrsLastArg);

  lr_end_transaction("send_snmp_trap", LR_AUTO);

  return 0;
}

vuser_end()
{
  lrs_cleanup();  // Terminates the use of the WinSock DLL. 

  return 0;
}

// Here is the contents of the data.ws file.

;WSRData 2 1

// Once input values are parameterised, the size of the buffer may need to change (not sure how to handle dynamic sizing).
// To decode the hex values, just replay the script with full logging and look at the Replay Log.
// Note that VuGen throws an error if comments appear next to the constant strings in the buffer.
// Buffer size: 16 columns x 65 rows - 4 bytes = 1040 - 4 = 1036 bytes
send  buf0 625
	"\x30\x82\x04\x0a\x02\x01\x01\x04\x06\x70\x75\x62\x6c\x69\x63\xa7"
	"\x82\x03\xfb\x02\x01\x04\x02\x01\x00\x02\x01\x00\x30\x82\x03\xee"
	"\x30\x0e\x06\x08\x2b\x06\x01\x02\x01\x01\x03\x00\x43\x02\x05\x13"
	"\x30\x19\x06\x0a\x2b\x06\x01\x06\x03\x01\x01\x04\x01\x00\x06\x0b"
	"\x2b\x06\x01\x04\x01\x09\x09\x82\x37\x00\x02\x30\x22\x06\x0f\x2b"
	"\x06\x01\x04\x01\x09\x09\x82\x37\x01\x01\x02\x01\x02\x01\x04\x0f"
	"\x63\x65\x6e\x41\x6c\x61\x72\x6d\x56\x65\x72\x73\x69\x6f\x6e\x30"
	"\x16\x06\x0f\x2b\x06\x01\x04\x01\x09\x09\x82\x37\x01\x01\x02\x01"
	"\x03\x01\x43\x03\x01\x8a\x92\x30\x16\x06\x0f\x2b\x06\x01\x04\x01"
	"\x09\x09\x82\x37\x01\x01\x02\x01\x04\x01\x43\x03\x01\x8a\x92\x30"
	"\x25\x06\x0f\x2b\x06\x01\x04\x01\x09\x09\x82\x37\x01\x01\x02\x01"
	"\x05\x01\x04\x12\x63\x65\x6e\x41\x6c\x61\x72\x6d\x49\x6e\x73\x74"
	"\x61\x6e\x63\x65\x49\x44\x30\x14\x06\x0f\x2b\x06\x01\x04\x01\x09"
	"\x09\x82\x37\x01\x01\x02\x01\x06\x01\x02\x01\x01\x30\x2b\x06\x0f"
	"\x2b\x06\x01\x04\x01\x09\x09\x82\x37\x01\x01\x02\x01\x07\x01\x04"
	"\x18\x63\x65\x6e\x41\x6c\x61\x72\x6d\x53\x74\x61\x74\x75\x73\x44"
	"\x65\x66\x69\x6e\x69\x74\x69\x6f\x6e\x30\x14\x06\x0f\x2b\x06\x01"
	"\x04\x01\x09\x09\x82\x37\x01\x01\x02\x01\x08\x01\x02\x01\x01\x30"
	"\x14\x06\x0f\x2b\x06\x01\x04\x01\x09\x09\x82\x37\x01\x01\x02\x01"
	"\x09\x01\x02\x01\x00\x30\x2d\x06\x0f\x2b\x06\x01\x04\x01\x09\x09"
	"\x82\x37\x01\x01\x02\x01\x0a\x01\x04\x1a\x63\x65\x6e\x41\x6c\x61"
	"\x72\x6d\x43\x61\x74\x65\x67\x6f\x72\x79\x44\x65\x66\x69\x6e\x69"
	"\x74\x69\x6f\x6e\x30\x14\x06\x0f\x2b\x06\x01\x04\x01\x09\x09\x82"
	"\x37\x01\x01\x02\x01\x0b\x01\x02\x01\x00\x30\x28\x06\x0f\x2b\x06"
	"\x01\x04\x01\x09\x09\x82\x37\x01\x01\x02\x01\x0c\x01\x04\x15\x63"
	"\x65\x6e\x41\x6c\x61\x72\x6d\x53\x65\x72\x76\x65\x72\x41\x64\x64"
	"\x72\x65\x73\x73\x30\x2e\x06\x0f\x2b\x06\x01\x04\x01\x09\x09\x82"
	"\x37\x01\x01\x02\x01\x0d\x01\x04\x1b\x63\x65\x6e\x41\x6c\x61\x72"
	"\x6d\x4d\x61\x6e\x61\x67\x65\x64\x4f\x62\x6a\x65\x63\x74\x43\x6c"
	"\x61\x73\x73\x31\x30\x14\x06\x0f\x2b\x06\x01\x04\x01\x09\x09\x82"
	"\x37\x01\x01\x02\x01\x0e\x01\x02\x01\x00\x30\x21\x06\x0f\x2b\x06"
	"\x01\x04\x01\x09\x09\x82\x37\x01\x01\x02\x01\x0f\x01\x04\x0e\x31"
	"\x30\x2e\x32\x33\x32\x2e\x31\x38\x30\x2e\x31\x30\x31\x30\x46\x06"
	"\x0f\x2b\x06\x01\x04\x01\x09\x09\x82\x37\x01\x01\x02\x01\x10\x01"
	"\x04\x33\x58\x58\x58\x3a\x43\x6f\x6d\x70\x6f\x6e\x65\x6e\x74\x3d"
	"\x43\x6f\x6d\x70\x6f\x6e\x65\x6e\x74\x31\x3b\x43\x6f\x6d\x70\x6f"
	"\x6e\x65\x6e\x74\x43\x6c\x61\x73\x73\x2d\x43\x43\x6c\x61\x73\x73"
	"\x31\x3b\x59\x59\x59\x30\x14\x06\x0f\x2b\x06\x01\x04\x01\x09\x09"
	"\x82\x37\x01\x01\x02\x01\x11\x01\x02\x01\x02\x30\x2d\x06\x0f\x2b"
	"\x06\x01\x04\x01\x09\x09\x82\x37\x01\x01\x02\x01\x12\x01\x04\x1a"
	"\x63\x65\x6e\x41\x6c\x61\x72\x6d\x53\x65\x76\x65\x72\x69\x74\x79"
	"\x44\x65\x66\x69\x6e\x69\x74\x69\x6f\x6e\x30\x14\x06\x0f\x2b\x06"
	"\x01\x04\x01\x09\x09\x82\x37\x01\x01\x02\x01\x13\x01\x02\x01\x01"
	"\x30\x17\x06\x0f\x2b\x06\x01\x04\x01\x09\x09\x82\x37\x01\x01\x02"
	"\x01\x14\x01\x04\x04\x31\x30\x30\x30\x30\x22\x06\x0f\x2b\x06\x01"
	"\x04\x01\x09\x09\x82\x37\x01\x01\x02\x01\x15\x01\x04\x0f\x63\x65"
	"\x6e\x55\x73\x65\x72\x4d\x65\x73\x73\x61\x67\x65\x31\x30\x22\x06"
	"\x0f\x2b\x06\x01\x04\x01\x09\x09\x82\x37\x01\x01\x02\x01\x16\x01"
	"\x04\x0f\x63\x65\x6e\x55\x73\x65\x72\x4d\x65\x73\x73\x61\x67\x65"
	"\x32\x30\x22\x06\x0f\x2b\x06\x01\x04\x01\x09\x09\x82\x37\x01\x01"
	"\x02\x01\x17\x01\x04\x0f\x63\x65\x6e\x55\x73\x65\x72\x4d\x65\x73"
	"\x73\x61\x67\x65\x33\x30\x14\x06\x0f\x2b\x06\x01\x04\x01\x09\x09"
	"\x82\x37\x01\x01\x02\x01\x18\x01\x02\x01\x02\x30\x14\x06\x0f\x2b"
	"\x06\x01\x04\x01\x09\x09\x82\x37\x01\x01\x02\x01\x19\x01\x42\x01"
	"\x01\x30\x23\x06\x0f\x2b\x06\x01\x04\x01\x09\x09\x82\x37\x01\x01"
	"\x02\x01\x1a\x01\x04\x10\x63\x65\x6e\x50\x61\x72\x74\x69\x74\x69"
	"\x6f\x6e\x4e\x61\x6d\x65\x30\x2c\x06\x0f\x2b\x06\x01\x04\x01\x09"
	"\x09\x82\x37\x01\x01\x02\x01\x1b\x01\x04\x19\x63\x65\x6e\x43\x75"
	"\x73\x74\x6f\x6d\x65\x72\x49\x64\x65\x6e\x74\x69\x66\x69\x63\x61"
	"\x74\x69\x6f\x6e\x30\x26\x06\x0f\x2b\x06\x01\x04\x01\x09\x09\x82"
	"\x37\x01\x01\x02\x01\x1c\x01\x04\x13\x63\x65\x6e\x43\x75\x73\x74"
	"\x6f\x6d\x65\x72\x52\x65\x76\x69\x73\x69\x6f\x6e\x30\x1d\x06\x0f"
	"\x2b\x06\x01\x04\x01\x09\x09\x82\x37\x01\x01\x02\x01\x1d\x01\x04"
	"\x0a\x63\x65\x6e\x41\x6c\x65\x72\x74\x49\x44\x30\x11\x06\x09\x2b"
	"\x06\x01\x06\x03\x12\x01\x03\x00\x40\x04\x7f\x00"

-1

But theory doesn’t quite match reality. Wireshark identifies this as UDP data, instead of an SNMP trap. If anyone can explain this, I would love to hear from them.

Plan B is to use a Java vuser (instead of the Winsock vuser), and write some simple Java code that will send the SNMP trap. Here is the code:

/*
 * This LoadRunner script will send an SNMP trap.
 * 
 * It can be used with either the Java vuser type (available in the Templates bundle), 
 * or with the Java Record-Replay vuser type (available in the Java Record/Replay bundle).
 * Both bundles cost the same, so pick the one that is most useful for your other projects.
 * 
 * 
 * NOTES
 *
 * This script requires snmp4j-1.11.3.jar, which is available from http://www.snmp4j.org/
 * JavaDocs: http://www.snmp4j.org/doc/index.html
 * This script should be threadsafe, so you can run it as a process or a thread in the Runtime Settings.
 */

import lrapi.lr;               // LoadRunner methods (lr.start_transaction(), etc.)
import org.snmp4j.*;           // Provides classes and interfaces for creating, sending, and receiving SNMP messages.
import org.snmp4j.smi.*;       // Provides classes for the representation of SMIv1/v2 data types.
import org.snmp4j.mp.*;        // Provides classes and interfaces for the SNMP message processing.
import org.snmp4j.transport.*; // Provides transport protocol mappings for SNMP.

public class Actions
{
  public int init() throws Throwable {
    // Ignore this method.
    return 0;
  }//end of init


  public int action() throws Throwable {
    OID oid; // SNMP Object ID
    Variable var; // A Variable object can hold any of the SNMP variable types (e.g. OctetString, Integer32, Gauge32, TimeTicks,etc).

    // Create an SNMP Protocol Data Unit.
    PDU trap = new PDU();
    trap.setType(PDU.TRAP);

    // Create the OIDs and their values.
    // Variable Bindings: 31 Items
    // 1. SNMPv2-MIB::sysUpTime.0 (1.3.6.1.2.1.1.3.0): 1299
    trap.add(new VariableBinding(SnmpConstants.sysUpTime, new TimeTicks(1299)));
    // 2. SNMPv2-MIB::snmpTrapOID.0 (1.3.6.1.6.3.1.1.4.1.0): 1.3.6.1.4.1.9.9.311.0.2 (SNMPv2-SMI::enterprises.9.9.311.0.2)
    oid = new OID("1.3.6.1.4.1.9.9.311.0.2");
    trap.add(new VariableBinding(SnmpConstants.snmpTrapOID, oid));
    // 3. 1.3.6.1.4.1.9.9.311.1.1.2.1.2.1: 63656e416c61726d56657273696f6e
    oid = new OID("1.3.6.1.4.1.9.9.311.1.1.2.1.2.1");
    var = new OctetString("cenAlarmVersion");
    trap.add(new VariableBinding(oid, var));
    // 4. 1.3.6.1.4.1.9.9.311.1.1.2.1.3.1: 101010
    oid = new OID("1.3.6.1.4.1.9.9.311.1.1.2.1.3.1");
    var = new TimeTicks(101010);
    trap.add(new VariableBinding(oid, var));
    // 5. 1.3.6.1.4.1.9.9.311.1.1.2.1.4.1: 101010
    oid = new OID("1.3.6.1.4.1.9.9.311.1.1.2.1.4.1");
    var = new TimeTicks(101010);
    trap.add(new VariableBinding(oid, var));
    // 6. 1.3.6.1.4.1.9.9.311.1.1.2.1.5.1: 63656e416c61726d496e7374616e63654944
    oid = new OID("1.3.6.1.4.1.9.9.311.1.1.2.1.5.1");
    var = new OctetString("cenAlarmInstanceId");
    trap.add(new VariableBinding(oid, var));
    // 7. 1.3.6.1.4.1.9.9.311.1.1.2.1.6.1: 
    oid = new OID("1.3.6.1.4.1.9.9.311.1.1.2.1.6.1");
    var = new Integer32(1);
    trap.add(new VariableBinding(oid, var));
    // 8. 1.3.6.1.4.1.9.9.311.1.1.2.1.7.1: 63656e416c61726d537461747573446566696e6974696f6e
    oid = new OID("1.3.6.1.4.1.9.9.311.1.1.2.1.7.1");
    var = new OctetString("cenAlarmStatusDefinition");
    trap.add(new VariableBinding(oid, var));
    // 9. 1.3.6.1.4.1.9.9.311.1.1.2.1.8.1: 
    oid = new OID("1.3.6.1.4.1.9.9.311.1.1.2.1.8.1");
    var = new Integer32(1);
    trap.add(new VariableBinding(oid, var));
    // 10. 1.3.6.1.4.1.9.9.311.1.1.2.1.9.1: 
    oid = new OID("1.3.6.1.4.1.9.9.311.1.1.2.1.9.1");
    var = new Integer32(0);
    trap.add(new VariableBinding(oid, var));
    // 11. 1.3.6.1.4.1.9.9.311.1.1.2.1.10.1: 63656e416c61726d43617465676f7279446566696e697469...
    oid = new OID("1.3.6.1.4.1.9.9.311.1.1.2.1.10.1");
    var = new OctetString("cenAlarmCategoryDefinition");
    trap.add(new VariableBinding(oid, var));
    // 12. 1.3.6.1.4.1.9.9.311.1.1.2.1.11.1: 
    oid = new OID("1.3.6.1.4.1.9.9.311.1.1.2.1.11.1");
    var = new Integer32(0);
    trap.add(new VariableBinding(oid, var));
    // 13. 1.3.6.1.4.1.9.9.311.1.1.2.1.12.1: 63656e416c61726d53657276657241646472657373
    oid = new OID("1.3.6.1.4.1.9.9.311.1.1.2.1.12.1");
    var = new OctetString("cenAlarmServerAddress");
    trap.add(new VariableBinding(oid, var));
    // 14. 1.3.6.1.4.1.9.9.311.1.1.2.1.13.1: 63656e416c61726d4d616e616765644f626a656374436c61...
    oid = new OID("1.3.6.1.4.1.9.9.311.1.1.2.1.13.1");
    var = new OctetString("cenAlarmManagedObjectClass");
    trap.add(new VariableBinding(oid, var));
    // 15. 1.3.6.1.4.1.9.9.311.1.1.2.1.14.1: 
    oid = new OID("1.3.6.1.4.1.9.9.311.1.1.2.1.14.1");
    var = new Integer32(0);
    trap.add(new VariableBinding(oid, var));
    // 16. 1.3.6.1.4.1.9.9.311.1.1.2.1.15.1: 31302e3233322e3138302e313031
    oid = new OID("1.3.6.1.4.1.9.9.311.1.1.2.1.15.1");
    var = new OctetString("10.232.180.101");
    trap.add(new VariableBinding(oid, var));
    // 17. 1.3.6.1.4.1.9.9.311.1.1.2.1.16.1: 5858583a436f6d706f6e656e743d436f6d706f6e656e7431...
    oid = new OID("1.3.6.1.4.1.9.9.311.1.1.2.1.16.1");
    var = new OctetString("XXX:Component=Component1;ComponentClass-cclass1;YYY"); // Is this correct? Should it be "ComponentClass="?
    trap.add(new VariableBinding(oid, var));
    // 18. 1.3.6.1.4.1.9.9.311.1.1.2.1.17.1: 
    oid = new OID("1.3.6.1.4.1.9.9.311.1.1.2.1.17.1");
    var = new Integer32(2);
    trap.add(new VariableBinding(oid, var));
    // 19. 1.3.6.1.4.1.9.9.311.1.1.2.1.18.1: 63656e416c61726d5365766572697479446566696e697469...
    oid = new OID("1.3.6.1.4.1.9.9.311.1.1.2.1.18.1");
    var = new OctetString("cenAlarmSeverityDefinition");
    trap.add(new VariableBinding(oid, var));
    // 20. 1.3.6.1.4.1.9.9.311.1.1.2.1.19.1: 
    oid = new OID("1.3.6.1.4.1.9.9.311.1.1.2.1.19.1");
    var = new Integer32(1);
    trap.add(new VariableBinding(oid, var));
    // 21. 1.3.6.1.4.1.9.9.311.1.1.2.1.20.1: 31303030
    oid = new OID("1.3.6.1.4.1.9.9.311.1.1.2.1.20.1");
    var = new OctetString("1000");
    trap.add(new VariableBinding(oid, var));
    // 22. 1.3.6.1.4.1.9.9.311.1.1.2.1.21.1: 63656e557365724d65737361676531
    oid = new OID("1.3.6.1.4.1.9.9.311.1.1.2.1.21.1");
    var = new OctetString("cenUserMessage1");
    trap.add(new VariableBinding(oid, var));
    // 23. 1.3.6.1.4.1.9.9.311.1.1.2.1.22.1: 63656e557365724d65737361676532
    oid = new OID("1.3.6.1.4.1.9.9.311.1.1.2.1.22.1");
    var = new OctetString("cenUserMessage2");
    trap.add(new VariableBinding(oid, var));
    // 24. 1.3.6.1.4.1.9.9.311.1.1.2.1.23.1: 63656e557365724d65737361676533
    oid = new OID("1.3.6.1.4.1.9.9.311.1.1.2.1.23.1");
    var = new OctetString("cenUserMessage3");
    trap.add(new VariableBinding(oid, var));
    // 25. 1.3.6.1.4.1.9.9.311.1.1.2.1.24.1: 
    oid = new OID("1.3.6.1.4.1.9.9.311.1.1.2.1.24.1");
    var = new Integer32(2);
    trap.add(new VariableBinding(oid, var));
    // 26. 1.3.6.1.4.1.9.9.311.1.1.2.1.25.1: 1
    oid = new OID("1.3.6.1.4.1.9.9.311.1.1.2.1.25.1");
    var = new Gauge32(1);
    trap.add(new VariableBinding(oid, var));
    // 27. 1.3.6.1.4.1.9.9.311.1.1.2.1.26.1: 63656e506172746974696f6e4e616d65
    oid = new OID("1.3.6.1.4.1.9.9.311.1.1.2.1.26.1");
    var = new OctetString("cenPartitionName");
    trap.add(new VariableBinding(oid, var));
    // 28. 1.3.6.1.4.1.9.9.311.1.1.2.1.27.1: 63656e437573746f6d65724964656e74696669636174696f...
    oid = new OID("1.3.6.1.4.1.9.9.311.1.1.2.1.27.1");
    var = new OctetString("cenCustomerIdentification");
    trap.add(new VariableBinding(oid, var));
    // 29. 1.3.6.1.4.1.9.9.311.1.1.2.1.28.1: 63656e437573746f6d65725265766973696f6e
    oid = new OID("1.3.6.1.4.1.9.9.311.1.1.2.1.28.1");
    var = new OctetString("cenCustomerRevision");
    trap.add(new VariableBinding(oid, var));
    // 30. 1.3.6.1.4.1.9.9.311.1.1.2.1.29.1: 63656e416c6572744944
    oid = new OID("1.3.6.1.4.1.9.9.311.1.1.2.1.29.1");
    var = new OctetString("cenAlertId");
    trap.add(new VariableBinding(oid, var));
    // 31. SNMP-COMMUNITY-MIB::snmpTrapAddress.0 (1.3.6.1.6.3.18.1.3.0): 127.0.0.1 (127.0.0.1)
    oid = new OID(SnmpConstants.snmpTrapAddress);
    var = new IpAddress("127.0.0.1");
    trap.add(new VariableBinding(oid, var));

    // Specify server to send the trap to.
    Address targetaddress = new UdpAddress("10.232.181.31/162"); // Server listens for SNMP traps on port 162.
    CommunityTarget target = new CommunityTarget();
    target.setCommunity(new OctetString("public"));
    target.setVersion(SnmpConstants.version2c);
    target.setAddress(targetaddress);

    // Send the trap.
    lr.start_transaction("send_trap");
    Snmp snmp = new Snmp(new DefaultUdpTransportMapping());
    snmp.send(trap, target, null, null); 
    lr.end_transaction("send_trap", lr.AUTO);

    return 0;
  }//end of action


  public int end() throws Throwable {
    // Ignore this method.
    return 0;
  }//end of end
}

Success! Now that you have a working template (test it by running it from VuGen and doing a packet capture with Wireshark) you just have to modify the template to have the correct OIDs and value types, and replace your selected values with a parameter.

 

Published On: May 1, 2011Tags: ,

6 Comments

  1. Tim May 2, 2011 at 8:31 am - Reply

    Hey Stu,

    I’m guessing Wireshark couldn’t resolve the OID against its MIB templates. In my experience if the SNMP trap you send fails it falls back to being reported as UDP (because it couldn’t parse it in Wireshark) Maybe your hex data is borked …

    In general though, any *decent* scripting language can easily accomplish this task. IMHO using LR to send snmp traps is overkill =)
    e.g. in ruby
    require ‘snmp’
    include SNMP
    manager = Manager.new(:Host => ‘localhost’)
    varbind = VarBind.new(“1.3.6.1.2.1.1.5.0”, OctetString.new(“My System Name”))
    manager.set(varbind)
    manager.close

    BTW, Jmeter can also do UDP requests with Google’s plugins =)
    http://code.google.com/p/jmeter-plugins/wiki/UDPRequest?utm_source=jmeter&utm_medium=helplink&utm_campaign=UDPRequest

    Or you could roll your own sampler in a similar fashion to above.

    Nice work in showing us how it’s done with a Java vuser.

    Cheers,
    Tim

  2. Simon May 6, 2011 at 4:53 pm - Reply

    Hi Stuart,

    “If anyone can explain this, I would love to hear from them.”

    I’ve compared the Wireshark trace of the Loadrunner raw socket VUser with the Java VUser. The reason why Wireshark is interpreting the raw socket injection to be UDP and not SNMP is there’s some missing data at the end of the packet. Just add “\x00\x01” to buf0 in the Loadrunner raw socket script and Wireshark will start interpreting the injected packets as SNMP.

    This begs the question why Wireshark interpreted the original Cisco Enterprise Policy Manager message to be SNMP if this data was missing. Maybe the data got accidentally sliced off during the dumping process?

  3. Haja Mohideen May 18, 2011 at 6:00 pm - Reply

    It very nice to see the brief information that you have been provided about the the load test in the load runner. We are also have offering a product in doing the load testing, that you may reach us at, http://www.loadtracer.com/.

    In case if you need of any performance testing services then you may reach us at: info@loadtracer.com.

  4. Selvakumar June 14, 2012 at 7:13 pm - Reply

    You have third party tools that are as costly as loadrunner available for emulating SNMP devices. In this case, they take a copy of the SNMP database and create hundreds of virtual devices with different IP addresses. The virtual devices will respond to SNMP calls and can generate the traps as well.

  5. Abi February 14, 2013 at 1:24 am - Reply

    Anyone happened to know what other open source tools we could use to simulate the SNMP traps?

    • Jakub January 8, 2014 at 9:37 pm - Reply

      snmpwalk and snmptrap

Leave A Comment