[Kea-users] Is KEA trying to do some smart caching?

Ola Thoresen ola at nytt.no
Tue Apr 19 14:44:51 UTC 2016

... or am I doing something stupid?

Sorry for the long mail, hopefully it will explain the issue thoroughly.

I am trying to develop a plugin (hook) that will replace certain 
config-"variables" based on the incoming DHCP-request.

The plugin lives here: https://github.com/Olen/kea_hooks
And the relevant part is in pk4_send.cc

When the server receives a DHCP-request with Option82.2 set, it will 
send back a DHCP-reply with Option43.1 set to the same value.
But for some reason, the Reply is sent back to the client with the 
_wrong_ content.

The request comes in:

   type=050, len=004: (ipv4-address)
   type=053, len=001: 3 (uint8)
   type=054, len=004: (ipv4-address)
   type=082, len=023:,
     type=001, len=010: 67:65:2d:30:2f:30:2f:34:3a:31
     type=002, len=009: 74:65:73:74:2d:63:70:65:34

Option82.002 equals "test-cpe4" (hex encoded)

The server then replies with:

   type=001, len=004: 4294967040 (uint32)
   type=003, len=004:
   type=006, len=008:
   type=042, len=004:
   type=043, len=037:,
     type=001, len=009: "test-cpe2" (string)

- "test-cpe2" was the _first_ test i ran after restarting Kea.  No 
matter what I put in Option82, it will always reply with "test-cpe2".

My config file contains the following:

  "name": "config-file-name",
  "code": 1,
  "space": "vendor-encapsulated-options-space",
  "csv-format": true,
  "data": "@OPTION_82_2@"

So I look in my code, and in pkt4_send I try to do the following:
(Only the relevant parts of the code is quoted)

I get the packet-pointer:

         Pkt4Ptr response4_ptr;
         handle.getArgument("response4", response4_ptr);

I try to read the contents of Option43.1:

	OptionPtr opt_ptr = response4_ptr->getOption(opt_code);
	OptionPtr sub_ptr = opt_ptr->getOption(sub_code);

	option_data = sub_ptr->toString();
	debug("Returning data: " << option_data << "\n")					<------- A

Then I try to replace the "variable" with the correct value:

	string placeholder = "@OPTION_82_2@";
	string replace_with = <data from Option82_2>

	option_data.replace(option_data.find(placeholder), placeholder.size(), 

I have added a lot of debug to the code, and the first time after a 
restart, I see the following:

in: @OPTION_82_2@ = test-cpe2
Getting writable option 43.1
Getting option: 43.1
Returning data: cpe/config?hostname=@OPTION_82_2@						<------ B
Replacing @OPTION_82_2@ with test-cpe2 in option 
New option-value: cpe/config?hostname=test-cpe2
Adding option-value: cpe/config?hostname=test-cpe2 in 43.1
Option added

And everything works fine.

But any later DHCP-request will give the following:

in: @OPTION_82_2@ = test-cpe4
Getting writable option 43.1
Getting option: 43.1
Returning data: cpe/config?hostname=test-cpe2							<------ C

A is the debug line resulting it the two outputs B and C
B is first run - the response4_ptr->getOption returns the Option-value 
from the config-file
C is the second run.  Now response4_ptr is _not_ fresh from the config, 
but contains values from the previous dhcp-reply.

What do I need to do to make sure respones4_ptr contains a "fresh" 
packet, without any left overs from the old packets?

/Ola (T)

More information about the Kea-users mailing list