How to use the perfdhcp benchmarking tool
  • 10 Jun 2024
  • 10 Minutes to read
  • Contributors
  • Dark
    Light
  • PDF

How to use the perfdhcp benchmarking tool

  • Dark
    Light
  • PDF

Article summary

What is perfdhcp?

perfdhcp is a tool to generate DHCP traffic, which can be used to benchmark DHCP servers. It has many options available and this article will cover all of them in time, so watch this space!

The template feature

Templates allow us to do two things:

  1. To store frequently used perfdhcp command lines in files, for easy reference and reuse.
  2. To allow perfdhcp to simulate multiple clients by automatically randomising a portion of the message it sends to the DHCP server.
Format of template files

There are a couple of things to note about template files:

  1. They can contain only HEX data and optional whitespace, but nothing else.
  2. There may be only one line of data per file.

We'll take a look at an example of using templates with DHCPv6.

Let's start simply with a minimal, correct SOLICIT.

Firstly we need the hex representation of the packet. The easiest way to obtain this is to open a network traffic capture using Wireshark that contains DHCP v6 traffic and find a SOLICIT message:
1.png

Open the menu on the SOLICIT message select "Copy" and "..as Hex Stream":
2.png

Open a new text file, e.g. "template_solicit", and paste the copied stream into it. Verify that the contents are correct, then save it:

$cat >template_solicit
018934b40001000a00030001ffffffffff010003000c0000069a0000000000000000

Now that we have a template file, let's start Kea on a loopback interface for testing, using this simple configuration:

{
    "Dhcp6": {
        "option-data": [],
        "subnet6": [
            {
                "subnet": "2001:db8:1::/64",
                "pools": [
                    {
                        "pool": "2001:db8:1::51-2001:db8:1::5200"
                    }
                ],
                "interface": "lo0"
            }
        ],
        "interfaces-config": {
            "interfaces": [
                "lo0"
            ]
        },
        "loggers": [
            {
                "name": "kea-dhcp6",
                "output-options": [
                    {
                        "output": "stdout"
                    }
                ],
                "severity": "INFO",
            }
        ],
        "lease-database": {
            "type": "memfile"
        }
    }
}

Start Kea with sudo ./kea-dhcp6 -c kea-dhcp6.conf and wait until it's operational.

In a second terminal window start tcpdump to capture traffic on the loopback interface and write packets to a file:

sudo tcpdump -i lo0 -c 1000 -v -w perfdhcp_generated_traffic.pcap

Now it's time to generate some traffic, using perfdhcp and the template file. In a third terminal window do:

sudo ./perfdhcp -6 -l lo0 -r 1 -p 5 -T template_solicit

For simplicity we use options -r (rate) and -p (test period) to not flood our server with traffic. With configuration -r 1 -p 5, perfdhcp will execute one exchange per second for 5 seconds, then exit:

$sudo perfdhcp -6 -l lo0 -r 1 -p 5 -T template_solicit

Running: perfdhcp -6 -l lo0 -r 1 -p 5 -T template_solicit
Scenario: basic.
Multi-thread mode enabled.
***Rate statistics***
Rate: 0.799901 4-way exchanges/second, expected rate: 1

***Malformed Packets***
Malformed Packets: 0
***Statistics for: SOLICIT-ADVERTISE***
sent packets: 4
received packets: 4
drops: 0
drops ratio: 0 %
orphans: 0
rejected leases: 0
non unique addresses: 0

min delay: 0.451 ms
avg delay: 0.707 ms
max delay: 0.857 ms
std deviation: 0.153 ms
collected packets: 0

***Statistics for; REQUEST-REPLY***
sent packets: 4
received packets: 4
drops: 0
drops ratio: 0.000 %
orphans: 0
rejected leases: 0
non unique addresses: 0

min delay: 0.326 ms
avg delay: 0.398 ms
max delay: 0.457 ms
std deviation: 0.056 ms
collected packets: 0

If the connection is succesfull, Kea will log incoming packets and assign addresses:

<date> <time> INFO  [kea-dhcp6.dhcp6/49357.0xxxxxxxxxx] DHCP6_STARTING Kea DHCPv6 server version 2.5.6-git (development) starting
...
<date> <time> INFO  [kea-dhcp6.dhcp6/49357.0xxxxxxxxxx] DHCP6_STARTED Kea DHCPv6 server version 2.5.6-git started
<date> <time> INFO  [kea-dhcp6.dhcp6/49357.0xxxxxxxxxx] DHCP6_QUERY_LABEL received query: duid=[00:03:00:01:ff:ff:ff:ff:ff:01], [no hwaddr info], tid=0x0
<date> <time> INFO  [kea-dhcp6.dhcp6/49357.0xxxxxxxxxx] DHCP6_LEASE_ADVERT duid=[00:03:00:01:ff:ff:ff:ff:ff:01], [no hwaddr info], tid=0x0: lease for address 2001:db8:1::51 and iaid=1690 will be advertised
<date> <time> INFO  [kea-dhcp6.dhcp6/49357.0xxxxxxxxxx] DHCP6_QUERY_LABEL received query: duid=[00:03:00:01:ff:ff:ff:ff:ff:01], [no hwaddr info], tid=0x1
<date> <time> INFO  [kea-dhcp6.dhcp6/49357.0xxxxxxxxxx] DHCP6_LEASE_ALLOC duid=[00:03:00:01:ff:ff:ff:ff:ff:01], [no hwaddr info], tid=0x1: lease for address 2001:db8:1::51 and iaid=1690 has been allocated for 7200 seconds
<date> <time> INFO  [kea-dhcp6.dhcp6/49357.0xxxxxxxxxx] DHCP6_QUERY_LABEL received query: duid=[00:03:00:01:ff:ff:ff:ff:ff:01], [no hwaddr info], tid=0x2
<date> <time> INFO  [kea-dhcp6.dhcp6/49357.0xxxxxxxxxx] DHCP6_LEASE_ADVERT duid=[00:03:00:01:ff:ff:ff:ff:ff:01], [no hwaddr info], tid=0x2: lease for address 2001:db8:1::51 and iaid=1690 will be advertised
<date> <time> INFO  [kea-dhcp6.dhcp6/49357.0xxxxxxxxxx] DHCP6_QUERY_LABEL received query: duid=[00:03:00:01:ff:ff:ff:ff:ff:01], [no hwaddr info], tid=0x3
<date> <time> INFO  [kea-dhcp6.dhcp6/49357.0xxxxxxxxxx] DHCP6_LEASE_ALLOC duid=[00:03:00:01:ff:ff:ff:ff:ff:01], [no hwaddr info], tid=0x3: lease for address 2001:db8:1::51 and iaid=1690 has been allocated for 7200 seconds
<date> <time> INFO  [kea-dhcp6.dhcp6/49357.0xxxxxxxxxx] DHCP6_QUERY_LABEL received query: duid=[00:03:00:01:ff:ff:ff:ff:ff:01], [no hwaddr info], tid=0x4
<date> <time> INFO  [kea-dhcp6.dhcp6/49357.0xxxxxxxxxx] DHCP6_LEASE_ADVERT duid=[00:03:00:01:ff:ff:ff:ff:ff:01], [no hwaddr info], tid=0x4: lease for address 2001:db8:1::51 and iaid=1690 will be advertised
<date> <time> INFO  [kea-dhcp6.dhcp6/49357.0xxxxxxxxxx] DHCP6_QUERY_LABEL received query: duid=[00:03:00:01:ff:ff:ff:ff:ff:01], [no hwaddr info], tid=0x5
<date> <time> INFO  [kea-dhcp6.dhcp6/49357.0xxxxxxxxxx] DHCP6_LEASE_ALLOC duid=[00:03:00:01:ff:ff:ff:ff:ff:01], [no hwaddr info], tid=0x5: lease for address 2001:db8:1::51 and iaid=1690 has been allocated for 7200 seconds
<date> <time> INFO  [kea-dhcp6.dhcp6/49357.0xxxxxxxxxx] DHCP6_QUERY_LABEL received query: duid=[00:03:00:01:ff:ff:ff:ff:ff:01], [no hwaddr info], tid=0x6
<date> <time> INFO  [kea-dhcp6.dhcp6/49357.0xxxxxxxxxx] DHCP6_LEASE_ADVERT duid=[00:03:00:01:ff:ff:ff:ff:ff:01], [no hwaddr info], tid=0x6: lease for address 2001:db8:1::51 and iaid=1690 will be advertised
<date> <time> INFO  [kea-dhcp6.dhcp6/49357.0xxxxxxxxxx] DHCP6_QUERY_LABEL received query: duid=[00:03:00:01:ff:ff:ff:ff:ff:01], [no hwaddr info], tid=0x7
<date> <time> INFO  [kea-dhcp6.dhcp6/49357.0xxxxxxxxxx] DHCP6_LEASE_ALLOC duid=[00:03:00:01:ff:ff:ff:ff:ff:01], [no hwaddr info], tid=0x7: lease for address 2001:db8:1::51 and iaid=1690 has been allocated for 7200 seconds
  1. Stop tcpdump and open the file perfdhcp_generated_traffic.pcap in Wireshark. Each SOLICIT message generated will be exactly the same as the one in the template. You can verify in the Kea leases file that only one address was assigned to one client. This shows that we have generated traffic successfully using template feature.
    6.png

Let's use the template feature to generate traffic from multiple clients

How can we modify each SOLICIT message using a template?

We need a combination of options -O and -R to simulate multiple clients and to cause perfdhcp to generate different data from each of them.

  • -O <number> defines from which byte (in the supplied hex in the template) perfdhcp will start its modification.
  • -R <number> defines the number of clients to simulate.
How many clients and how many modified bytes?

The number of bytes that are modified depends on the number of clients being simulated

If the number of simulated clients is between 1 and 255, only one byte (to which the randomization offset points) is randomized. If the number of simulated clients is between 256 and 65535, two bytes are randomized.

Our template is:
018934b40001000a00030001ffffffffff010003000c0000069a0000000000000000 of which 0001000a00030001ffffffffff01 is the client id option we want to randomize, which is 14 bytes long, starting at the 5th byte in the template.

To change the last byte of this option we should use -O 17 with the number of clients greater than 1.
We'll use sudo ./perfdhcp -6 -l lo0 -r 3 -p 5 -T template_solicit -O 17 -R 1000 to specify:

  • -6 DHCP version 6.
  • -l lo0 says to use the local address of interface loopback 0 as the source of packets.
  • -r 3 limit requests to three per second.
  • -p 5 run the test for five seconds.
  • -T template_solicit use the template held in the file "template_solicit".
  • -O 17 defines the offset in the template hex to start modification.
  • -R 1000 tells perfdhcp to simulate 1,000 clients.

Before running the test:

  1. Stop Kea.
  2. Delete the leases file.
  3. Start tcpdump in a separate terminal window.
  4. Start the Kea server again.

Running perfdhcp with the parameters above produces something like this:

$sudo ./perfdhcp -6 -l lo0 -r 3 -p 5 -T template_solicit -O 17 -R 1000
Running: perfdhcp -6 -l lo0 -r 3 -p 5 -T template_solicit -O 17 -R 1000
Scenario: basic.
Multi-thread mode enabled.
***Rate statistics***
Rate: 2.79936 4-way exchanges/second, expected rate: 3

***Malformed Packets***
Malformed packets: 0
***Statistics for: SOLICIT-ADVERTISE***
sent packets: 14
received packets: 14
drops: 0
drops ratio: 0 %
orphans: 0
rejected leases: 0
non unique addresses: 0

min delay: 0.304 ms
abg delay: 0.401 ms
max delay: 0.594 ms
std deviation: 0.094 ms
collected packets: 0

***Statistics for: REQUEST-REPLY***
sent packets: 14
received packets: 14
drops: 0
drops ratio: 0.000 %
orphans: 0
rejected leases: 0
non unique addresses: 0

min delay: 0.290 ms
abg delay: 0.331 ms
max delay: 0.423 ms
std deviation: 0.038 ms
collected packets: 0

Looking at the logs this time, we can see that Kea assigned addresses to multiple clients:

<date> <time> INFO  [kea-dhcp6.dhcp6/49357.0xxxxxxxxxx] DHCP6_STARTING Kea DHCPv6 server version 2.5.6-git (development) starting
...
<date> <time> INFO  [kea-dhcp6.dhcp6/49357.0xxxxxxxxxx] DHCP6_STARTED Kea DHCPv6 server version 2.5.6-git started
<date> <time> INFO  [kea-dhcp6.dhcp6/49357.0xxxxxxxxxx] DHCP6_QUERY_LABEL received query: duid=[00:03:00:01:ff:ff:ff:ff:ff:01], [no hwaddr info], tid=0x0
<date> <time> INFO  [kea-dhcp6.leases/49357.0xxxxxxxxxx] DHCP6_LEASE_ADVERT duid=[00:03:00:01:ff:ff:ff:ff:ff:01], [no hwaddr info], tid=0x0: lease for address 2001:db8:1::51 and iaid=1690 will be advertised
<date> <time> INFO  [kea-dhcp6.dhcp6/49357.0xxxxxxxxxx] DHCP6_QUERY_LABEL received query: duid=[00:03:00:01:ff:ff:ff:ff:ff:01], [no hwaddr info], tid=0x1
<date> <time> INFO  [kea-dhcp6.leases/49357.0xxxxxxxxxx] DHCP6_LEASE_ALLOC duid=[00:03:00:01:ff:ff:ff:ff:ff:01], [no hwaddr info], tid=0x1: lease for address 2001:db8:1::51 and iaid=1690 has been allocated for 7200 seconds
<date> <time> INFO  [kea-dhcp6.dhcp6/49357.0xxxxxxxxxx] DHCP6_QUERY_LABEL received query: duid=[00:03:00:01:ff:ff:ff:ff:ff:01], [no hwaddr info], tid=0x2
<date> <time> INFO  [kea-dhcp6.leases/49357.0xxxxxxxxxx] DHCP6_LEASE_ADVERT duid=[00:03:00:01:ff:ff:ff:ff:ff:01], [no hwaddr info], tid=0x2: lease for address 2001:db8:1::51 and iaid=1690 will be advertised
<date> <time> INFO  [kea-dhcp6.dhcp6/49357.0xxxxxxxxxx] DHCP6_QUERY_LABEL received query: duid=[00:03:00:01:ff:ff:ff:ff:ff:01], [no hwaddr info], tid=0x3
<date> <time> INFO  [kea-dhcp6.leases/49357.0xxxxxxxxxx] DHCP6_LEASE_ALLOC duid=[00:03:00:01:ff:ff:ff:ff:ff:01], [no hwaddr info], tid=0x3: lease for address 2001:db8:1::51 and iaid=1690 has been allocated for 7200 seconds
<date> <time> INFO  [kea-dhcp6.dhcp6/49357.0xxxxxxxxxx] DHCP6_QUERY_LABEL received query: duid=[00:03:00:01:ff:ff:ff:ff:ff:01], [no hwaddr info], tid=0x4
<date> <time> INFO  [kea-dhcp6.leases/49357.0xxxxxxxxxx] DHCP6_LEASE_ADVERT duid=[00:03:00:01:ff:ff:ff:ff:ff:01], [no hwaddr info], tid=0x4: lease for address 2001:db8:1::51 and iaid=1690 will be advertised
<date> <time> INFO  [kea-dhcp6.dhcp6/49357.0xxxxxxxxxx] DHCP6_QUERY_LABEL received query: duid=[00:03:00:01:ff:ff:ff:ff:ff:01], [no hwaddr info], tid=0x5
<date> <time> INFO  [kea-dhcp6.leases/49357.0xxxxxxxxxx] DHCP6_LEASE_ALLOC duid=[00:03:00:01:ff:ff:ff:ff:ff:01], [no hwaddr info], tid=0x5: lease for address 2001:db8:1::51 and iaid=1690 has been allocated for 7200 seconds
<date> <time> INFO  [kea-dhcp6.dhcp6/49357.0xxxxxxxxxx] DHCP6_QUERY_LABEL received query: duid=[00:03:00:01:ff:ff:ff:ff:ff:01], [no hwaddr info], tid=0x6
<date> <time> INFO  [kea-dhcp6.leases/49357.0xxxxxxxxxx] DHCP6_LEASE_ADVERT duid=[00:03:00:01:ff:ff:ff:ff:ff:01], [no hwaddr info], tid=0x6: lease for address 2001:db8:1::51 and iaid=1690 will be advertised
<date> <time> INFO  [kea-dhcp6.dhcp6/49357.0xxxxxxxxxx] DHCP6_QUERY_LABEL received query: duid=[00:03:00:01:ff:ff:ff:ff:ff:01], [no hwaddr info], tid=0x7
<date> <time> INFO  [kea-dhcp6.leases/49357.0xxxxxxxxxx] DHCP6_LEASE_ALLOC duid=[00:03:00:01:ff:ff:ff:ff:ff:01], [no hwaddr info], tid=0x7: lease for address 2001:db8:1::51 and iaid=1690 has been allocated for 7200 seconds
<date> <time> INFO  [kea-dhcp6.dhcp6/49357.0xxxxxxxxxx] DHCP6_QUERY_LABEL received query: duid=[00:03:00:01:ff:ff:ff:ff:ff:01], [no hwaddr info], tid=0x8
<date> <time> INFO  [kea-dhcp6.leases/49357.0xxxxxxxxxx] DHCP6_LEASE_ADVERT duid=[00:03:00:01:ff:ff:ff:ff:ff:01], [no hwaddr info], tid=0x8: lease for address 2001:db8:1::51 and iaid=1690 will be advertised
<date> <time> INFO  [kea-dhcp6.dhcp6/49357.0xxxxxxxxxx] DHCP6_QUERY_LABEL received query: duid=[00:03:00:01:ff:ff:ff:ff:ff:01], [no hwaddr info], tid=0x9
<date> <time> INFO  [kea-dhcp6.leases/49357.0xxxxxxxxxx] DHCP6_LEASE_ALLOC duid=[00:03:00:01:ff:ff:ff:ff:ff:01], [no hwaddr info], tid=0x9: lease for address 2001:db8:1::51 and iaid=1690 has been allocated for 7200 seconds
<date> <time> INFO  [kea-dhcp6.dhcp6/49357.0xxxxxxxxxx] DHCP6_QUERY_LABEL received query: duid=[00:03:00:01:ff:ff:ff:ff:ff:01], [no hwaddr info], tid=0xa
<date> <time> INFO  [kea-dhcp6.leases/49357.0xxxxxxxxxx] DHCP6_LEASE_ADVERT duid=[00:03:00:01:ff:ff:ff:ff:ff:01], [no hwaddr info], tid=0xa: lease for address 2001:db8:1::51 and iaid=1690 will be advertised
<date> <time> INFO  [kea-dhcp6.dhcp6/49357.0xxxxxxxxxx] DHCP6_QUERY_LABEL received query: duid=[00:03:00:01:ff:ff:ff:ff:ff:01], [no hwaddr info], tid=0xb
<date> <time> INFO  [kea-dhcp6.leases/49357.0xxxxxxxxxx] DHCP6_LEASE_ALLOC duid=[00:03:00:01:ff:ff:ff:ff:ff:01], [no hwaddr info], tid=0xb: lease for address 2001:db8:1::51 and iaid=1690 has been allocated for 7200 seconds
<date> <time> INFO  [kea-dhcp6.dhcp6/49357.0xxxxxxxxxx] DHCP6_QUERY_LABEL received query: duid=[00:03:00:01:ff:ff:ff:ff:ff:01], [no hwaddr info], tid=0xc
<date> <time> INFO  [kea-dhcp6.leases/49357.0xxxxxxxxxx] DHCP6_LEASE_ADVERT duid=[00:03:00:01:ff:ff:ff:ff:ff:01], [no hwaddr info], tid=0xc: lease for address 2001:db8:1::51 and iaid=1690 will be advertised
<date> <time> INFO  [kea-dhcp6.dhcp6/49357.0xxxxxxxxxx] DHCP6_QUERY_LABEL received query: duid=[00:03:00:01:ff:ff:ff:ff:ff:01], [no hwaddr info], tid=0xd
<date> <time> INFO  [kea-dhcp6.leases/49357.0xxxxxxxxxx] DHCP6_LEASE_ALLOC duid=[00:03:00:01:ff:ff:ff:ff:ff:01], [no hwaddr info], tid=0xd: lease for address 2001:db8:1::51 and iaid=1690 has been allocated for 7200 seconds
<date> <time> INFO  [kea-dhcp6.dhcp6/49357.0xxxxxxxxxx] DHCP6_QUERY_LABEL received query: duid=[00:03:00:01:ff:ff:ff:ff:ff:01], [no hwaddr info], tid=0xe
<date> <time> INFO  [kea-dhcp6.leases/49357.0xxxxxxxxxx] DHCP6_LEASE_ADVERT duid=[00:03:00:01:ff:ff:ff:ff:ff:01], [no hwaddr info], tid=0xe: lease for address 2001:db8:1::51 and iaid=1690 will be advertised
<date> <time> INFO  [kea-dhcp6.dhcp6/49357.0xxxxxxxxxx] DHCP6_QUERY_LABEL received query: duid=[00:03:00:01:ff:ff:ff:ff:ff:01], [no hwaddr info], tid=0xf
<date> <time> INFO  [kea-dhcp6.leases/49357.0xxxxxxxxxx] DHCP6_LEASE_ALLOC duid=[00:03:00:01:ff:ff:ff:ff:ff:01], [no hwaddr info], tid=0xf: lease for address 2001:db8:1::51 and iaid=1690 has been allocated for 7200 seconds
<date> <time> INFO  [kea-dhcp6.dhcp6/49357.0xxxxxxxxxx] DHCP6_QUERY_LABEL received query: duid=[00:03:00:01:ff:ff:ff:ff:ff:01], [no hwaddr info], tid=0x10
<date> <time> INFO  [kea-dhcp6.leases/49357.0xxxxxxxxxx] DHCP6_LEASE_ADVERT duid=[00:03:00:01:ff:ff:ff:ff:ff:01], [no hwaddr info], tid=0x10: lease for address 2001:db8:1::51 and iaid=1690 will be advertised
<date> <time> INFO  [kea-dhcp6.dhcp6/49357.0xxxxxxxxxx] DHCP6_QUERY_LABEL received query: duid=[00:03:00:01:ff:ff:ff:ff:ff:01], [no hwaddr info], tid=0x11
<date> <time> INFO  [kea-dhcp6.leases/49357.0xxxxxxxxxx] DHCP6_LEASE_ALLOC duid=[00:03:00:01:ff:ff:ff:ff:ff:01], [no hwaddr info], tid=0x11: lease for address 2001:db8:1::51 and iaid=1690 has been allocated for 7200 seconds

Here is what the leases file contains, following this run:

$ cat ../var/lib/kea/kea-leases6.csv 
address,duid,valid_lifetime,expire,subnet_id,pref_lifetime,lease_type,iaid,prefix_len,fqdn_fwd,fqdn_rev,hostname,hwaddr,state,user_context,hwtype,hwaddr_source,pool_id
2001:db8:1::51,00:03:00:01:ff:ff:ff:ff:ff:04,7200,1707959005,1,4500,0,1690,128,0,0,,ff:ff:ff:ff:ff:04,0,,1,2,0
2001:db8:1::52,00:03:00:01:ff:ff:ff:ff:ff:05,7200,1707959006,1,4500,0,1690,128,0,0,,ff:ff:ff:ff:ff:05,0,,1,2,0
2001:db8:1::53,00:03:00:01:ff:ff:ff:ff:ff:06,7200,1707959006,1,4500,0,1690,128,0,0,,ff:ff:ff:ff:ff:06,0,,1,2,0
2001:db8:1::54,00:03:00:01:ff:ff:ff:ff:ff:07,7200,1707959006,1,4500,0,1690,128,0,0,,ff:ff:ff:ff:ff:07,0,,1,2,0
2001:db8:1::55,00:03:00:01:ff:ff:ff:ff:ff:08,7200,1707959007,1,4500,0,1690,128,0,0,,ff:ff:ff:ff:ff:08,0,,1,2,0
2001:db8:1::56,00:03:00:01:ff:ff:ff:ff:ff:09,7200,1707959007,1,4500,0,1690,128,0,0,,ff:ff:ff:ff:ff:09,0,,1,2,0
2001:db8:1::57,00:03:00:01:ff:ff:ff:ff:ff:0a,7200,1707959007,1,4500,0,1690,128,0,0,,ff:ff:ff:ff:ff:0a,0,,1,2,0
2001:db8:1::58,00:03:00:01:ff:ff:ff:ff:ff:0b,7200,1707959008,1,4500,0,1690,128,0,0,,ff:ff:ff:ff:ff:0b,0,,1,2,0
2001:db8:1::59,00:03:00:01:ff:ff:ff:ff:ff:0c,7200,1707959008,1,4500,0,1690,128,0,0,,ff:ff:ff:ff:ff:0c,0,,1,2,0
2001:db8:1::5a,00:03:00:01:ff:ff:ff:ff:ff:0d,7200,1707959008,1,4500,0,1690,128,0,0,,ff:ff:ff:ff:ff:0d,0,,1,2,0
2001:db8:1::5b,00:03:00:01:ff:ff:ff:ff:ff:0e,7200,1707959009,1,4500,0,1690,128,0,0,,ff:ff:ff:ff:ff:0e,0,,1,2,0
2001:db8:1::5c,00:03:00:01:ff:ff:ff:ff:ff:0f,7200,1707959009,1,4500,0,1690,128,0,0,,ff:ff:ff:ff:ff:0f,0,,1,2,0
2001:db8:1::5d,00:03:00:01:ff:ff:ff:ff:ff:10,7200,1707959009,1,4500,0,1690,128,0,0,,ff:ff:ff:ff:ff:10,0,,1,2,0
2001:db8:1::5e,00:03:00:01:ff:ff:ff:ff:ff:11,7200,1707959010,1,4500,0,1690,128,0,0,,ff:ff:ff:ff:ff:11,0,,1,2,0

I used one template to manipulate SOLICIT. Can I change subsequent messages as well?

The -T option can be used twice.

  1. The first will be used as a template for the SOLICIT messages (or dhcpdiscovery if using dhcp v4).
  2. The second will be used for REQUEST messages (or dhcprequest if using dhcp v4).

You cannot use templates for RELEASE or RENEW.