Como no querrás que todas las peticiones lleven la MAC de la máquina que usas para hacer el
testeo sino que querrás usar varias o incluso una distinta por consulta, tendrás que abrir/crear un
socket SOCK_PACKET de tipo SOCK_RAW (en Linux, en otros sistemas operativos tendrás que buscar opciones similares). Léete la página man packet(7) que es sobre C, pero en Perl se hará de una forma muy parecida.
Otra opción para inyectar paquetes en la red es crearte una interfaz
tap (es relativamente sencillo, en el
codigo fuente del paquete
Linux::TunTap puedes ver un ejemplo de cómo hacerlo en Perl) y escribir y leer los paquetes que te lleguen desde el mismo. Tendrás que crearte un
bridge a nivel de sistema operativo para que los paquetes pasen del
tap al
eth0 o lo que toque.
A la hora de crear las tramas de DHCP seguramente te sirva
Net::DHCP::Packet.