DHCPv4
The system provides a Python object alc.dhcpv4
to inspect and modify DHCPv4 packets.
The alc.dhcpv4
object
Attributes
The object exposes the header fields as attributes on the object.
Attribute |
Field |
Access |
Type |
---|---|---|---|
pkt_len |
total length, in bytes, of the original DHCPv4-layer, pad-options included |
ro |
int |
pkt_netlen |
total length, in bytes, of the original DHCPv4-layer, pad-options excluded |
ro |
int |
op |
op |
ro |
bytes |
htype |
htype |
rw |
bytes |
hlen |
hlen |
rw |
bytes |
hops |
hops |
rw |
bytes |
xid |
xid |
ro |
bytes |
secs |
secs |
rw |
bytes |
flags |
flags |
rw |
bytes |
ciaddr |
ciaddr |
rw |
bytes |
yiaddr |
yiaddr |
rw |
bytes |
siaddr |
siaddr |
rw |
bytes |
giaddr |
giaddr |
rw |
bytes |
chaddr |
chaddr |
rw |
bytes |
sname |
sname |
rw |
bytes |
file |
file |
rw |
bytes |
Methods
- alc.Dhcpv4.drop()
Drops the resulting packet.
- alc.Dhcpv4.pad(min_size=300, /)
Pads the resulting DHCPv4 packet to the specified min_size with pad option(0) after executing the whole script. Padding is not performed if the result packet is already >=min_size. The default value of min_size is 300.
Although not defined in the DHCPv4 RFC, many DHCPv4 implementations require a minimum length of 300 bytes. This method can pad the result packet to the specified min_size.
- Parameters
min_size (int) – minimal size of resulting packet
- alc.Dhcpv4.get(option_code, /)
Returns all values of options with the specified option-code. The values are returned as the exact bytestrings as they appear in the packet.
If the specified option does not exist, the result is an empty tuple: ()
If a specific instance has zero length or no values, the corresponding bytestring in the result tuple is an empty bytestring: b””
- param int option_code
option-code to fetch
- rtype
tuple of bytestrings
import alc # For a packet with an address lease time option(51) with value 60: print(alc.dhcpv4.get(51)) # (b‘\x00\x00\x00\x3c’,) print([int.from_bytes(option, 'big') for option in alc.dhcpv4.get(51)]) # [60]
- alc.Dhcpv4.set(option_code, value, /)
Deletes existing options of the specified code and inserts new options with the specified code and value. Multiple values can be specified in a tuple, in which case an option is added for each item in the tuple.
- param int option_code
option-code to set
- param bytes|tuple(bytes) value
value of the option; the length is computed from this value
# To insert an address lease time option(51) with value 60: alc.dhcpv4.set(51, b'\x00\x00\x00\x3c')
- alc.Dhcpv4.clear(option_code, /)
Removes all options with the specified option-code.
- Parameters
option_code (int) – option-code to clear
- alc.Dhcpv4.getOptionList()
Returns a tuple of option-codes that are present in the top-level packet.
The order of the elements is the same as they appear in the packet.
If there are multiple instances of the same option, the option-code also appears multiple times in the tuple.
Pad(0) and End(255) options are excluded.
# for a discovery packet with options # msg-type/lease-time/request-addr/parameter-request-list/agent-info/end: print(alc.dhcpv4.getOptionList()) # (53,51,50,55,82,255)
DHCPv4 Option List (D4OL)
The D4OL is a nested data structure which represents the value of some DHCPv4 options.
The D4OL is a list where each element in the list is an instance of the specific option.
Each element is a dictionary, where:
the key is the sub-option-code (integer)
the value is a list with all instances of the sub-option, and each item in the list is a bytestring corresponding to the sub-option-value.
Example: for a packet with an option82 as in the following:
Option: (82) Agent Information Option
Length: 22
Option (82) Suboption: (1) Agent Circuit ID
Length: 8
Agent Circuit ID: 4a616e737656e73
Option (82) Suboption: (2) Agent Remote ID
Length: 10
Agent Remote ID: 62617369632364617461
results in the following D4OL:
option82 = alc.dhcpv4.get_relayagent() # [{2: [b'basic#data'], 1: [b'Jan:73sens']}]
option82[0][2][0] = b'basic#video' # [{2: [b'basic#video'], 1: [b'Jan:73sens']}]
alc.dhcpv4.set_relayagent(option82)