Skip to content

Commit cf80d39

Browse files
author
Jose Miguel Guzman
committed
option 82 and fixes
1 parent 19f4e72 commit cf80d39

File tree

3 files changed

+28
-10
lines changed

3 files changed

+28
-10
lines changed

dhcppython/client.py

Lines changed: 16 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -161,7 +161,7 @@ def get_lease(
161161
verbose: int = 0,
162162
) -> Lease:
163163
mac_addr = mac_addr or utils.random_mac()
164-
logging.debug("Sythensizing discover packet")
164+
logging.debug("Synthetizing discover packet")
165165

166166
# D
167167
discover = packet.DHCPPacket.Discover(
@@ -177,8 +177,8 @@ def get_lease(
177177
# O
178178
tries = 0
179179
while not (offer := self.receive_offer(tx_id, verbose)):
180-
logging.debug(f"Sleeping {self.retry_interval} ms then retyring discover")
181-
sleep(self.retry_interval // 1000)
180+
logging.debug(f"Sleeping {self.retry_interval} ms then retrying discover")
181+
sleep(self.retry_interval / 1000)
182182
logging.debug(
183183
f"Attempt {tries} - Sending discover packet to {server} with {tx_id=}"
184184
)
@@ -197,6 +197,7 @@ def get_lease(
197197
tx_id,
198198
use_broadcast=broadcast,
199199
option_list=options_list,
200+
client_ip=offer.yiaddr,
200201
relay=relay,
201202
)
202203
if verbose > 1:
@@ -208,8 +209,8 @@ def get_lease(
208209
# A
209210
tries = 0
210211
while not (ack := self.receive_ack(tx_id, verbose)):
211-
logging.debug(f"Sleeping {self.retry_interval} ms then retyring request")
212-
sleep(self.retry_interval // 1000)
212+
logging.debug(f"Sleeping {self.retry_interval} ms then retrying request")
213+
sleep(self.retry_interval / 1000)
213214
logging.debug(
214215
f"Attempt {tries} - Sending request packet to {server} with {tx_id=}"
215216
)
@@ -299,7 +300,7 @@ def listen(
299300
if verbosity > 2:
300301
print("Did not receive packet, sleeping...")
301302
tries += 1
302-
sleep(self.socket_poll_interval // 1000)
303+
sleep(self.socket_poll_interval / 1000)
303304
return dhcp_packet, addr
304305

305306
def get_socket(self, host: str, port: int) -> socket.socket:
@@ -311,7 +312,8 @@ def get_socket(self, host: str, port: int) -> socket.socket:
311312
try:
312313
# Option 25 is SO_BINDTODEVICE, allows us to specify a device
313314
# to bind to with this socket
314-
sock.setsockopt(socket.SOL_SOCKET, 25, self.interface.encode())
315+
sock.setsockopt(socket.SOL_SOCKET, socket.SO_BINDTODEVICE, self.interface.encode())
316+
logging.info(f"Binding to {self.interface}")
315317
except:
316318
# Less reliable method of binding to interface, required where
317319
# socket option 25 does not exist (Windows)
@@ -320,6 +322,8 @@ def get_socket(self, host: str, port: int) -> socket.socket:
320322
sock.bind((host, port))
321323
else:
322324
sock.bind((host, port))
325+
326+
logging.info(f"Bound {socket}")
323327
return sock
324328

325329
def get_writing_sockets(self) -> List[socket.socket]:
@@ -333,13 +337,15 @@ def get_listening_sockets(self) -> List[socket.socket]:
333337
socks = []
334338
host = ""
335339
for port in self.listening_ports:
340+
logging.debug(f"Creating socket to receiving data, binding to {(host, port)}")
336341
server_sock = self.get_socket(host, port)
337342
socks.append(server_sock)
338343
return socks
339344

340345
def send(self, remote_addr: str, remote_port: int, data: bytes, verbosity: int):
341346
tries = 0
342347
while tries < self.max_tries:
348+
logging.debug(f"Select: {select.select(self.listening_sockets, self.writing_sockets, self.except_sockets, self.select_timout,)}")
343349
if len(
344350
socks := select.select(
345351
self.listening_sockets,
@@ -354,11 +360,12 @@ def send(self, remote_addr: str, remote_port: int, data: bytes, verbosity: int):
354360
if verbosity > 1:
355361
print(f">> Sending packet {remote_addr}:{remote_port}")
356362
sock.sendto(data, (remote_addr, remote_port))
363+
logging.debug(f"Packet Sent")
357364
break
358365
else:
359-
logging.debug(
366+
logging.warning(
360367
f"Attempt {tries} - No sockets available to write to... "
361368
f"sleeping for {self.socket_poll_interval} ms"
362369
)
363370
tries += 1
364-
sleep(self.socket_poll_interval // 1000)
371+
sleep(self.socket_poll_interval / 1000)

dhcppython/options.py

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1779,6 +1779,16 @@ class StreetTalkDirectoryAssistanceServer(IPArrayOption):
17791779
code = 76
17801780
key = "stda_servers"
17811781

1782+
class RelayAgentInformation(StrOption):
1783+
"""
1784+
Option 82
1785+
1786+
Relay Agent Information
1787+
"""
1788+
1789+
code = 82
1790+
key = "relay_agent_info"
1791+
17821792

17831793
class UnknownOption(BinOption):
17841794
"""

dhcppython/packet.py

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -357,6 +357,7 @@ def Request(
357357
relay: Optional[str] = None,
358358
sname: bytes = b"",
359359
fname: bytes = b"",
360+
client_ip=ipaddress.IPv4Address(0),
360361
option_list: Optional[options.OptionList] = None,
361362
):
362363
"""
@@ -377,7 +378,7 @@ def Request(
377378
tx_id,
378379
seconds,
379380
0b1000_0000_0000_0000 if use_broadcast else 0,
380-
ipaddress.IPv4Address(0),
381+
client_ip,
381382
ipaddress.IPv4Address(0),
382383
ipaddress.IPv4Address(0),
383384
relay_ip,

0 commit comments

Comments
 (0)