DHCPv4
The system provides a Python object alc.dhcpv4, which is an instance of class alc.Dhcpv4, to inspect and modify DHCPv4 packets.
Note
Only the pre-provided
alc.dhcpv4object should be used in script, the classalc.Dhcpv4should not be used directly.
The alc.Dhcpv4 class
Instance Attributes
DHCPv4 header fields are exposed as instance 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
- drop()
- Drops the resulting packet. 
- 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 
 
- 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] 
- 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') 
- clear(option_code, /)
- Removes all options with the specified option-code. - Parameters
- option_code (int) – option-code to clear 
 
- 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)